2016-11-22 4 views
2

Ich möchte einige Datenmanipulationen durchführen, bevor ich eine JSON-Antwort mit DRF zurücksende.Wie schreibe ich einen benutzerdefinierten Serializer?

Situation

Mein Modell ist:

class ThirdParty(models.Model): 
    label = models.CharField(verbose_name=_("Third party label"), null=False, blank=False, default=DEFAUT_LABEL, max_length=255) 

class CashFlow(TimeStampedModel): 
    date = models.DateField(verbose_name=_("Due date"), null=True, blank=True) 
    forecasted_value = models.DecimalField(verbose_name=_("Forecasted value"), null=True, blank=True, max_digits=11, decimal_places=2) 
    third_party = models.ForeignKey(ThirdParty, null=False, blank=False, related_name='cashflows') 

Zur Zeit habe ich zwei Serializer:

class CashFlowSerializer(serializers.ModelSerializer): 
    third_party = serializers.PrimaryKeyRelatedField(many=False, read_only=True, allow_null=True) 
    class Meta: 
     model = CashFlow 
     fields = ('id', 'date', 'forecasted_value', 'edited_value', 'third_party') 

class ThirdPartyReadSerializer(serializers.ModelSerializer): 
    cashflows = CashFlowSerializer(many=True, read_only=True) 
    class Meta: 
     model = ThirdParty 
     fields = ('id', 'label', 'category', 'cashflows',) 

Und meine Thirdparty Ansicht korrekt ist eine schöne JSON als Rückkehr:

{ 
     "id": 15, 
     "label": "Adeo", 
     "category": 7, 
     "cashflows": [ 
      { 
       "id": 1, 
       "date": "2016-11-01", 
       "forecasted_value": "2000.00", 
       "edited_value": null, 
       "third_party": 15 
      }, 
      { 
       "id": 2, 
       "date": "2017-01-17", 
       "forecasted_value": "3000.00", 
       "edited_value": null, 
       "third_party": 15 
      }, 
      { 
       "id": 3, 
       "date": "2017-01-31", 
       "forecasted_value": "1000.00", 
       "edited_value": null, 
       "third_party": 15 
      } 
     ] 
    } 

Frage

Ich möchte die Cashflows nach Monat gruppieren und ihre Werte hinzufügen. Frage ist: Was ist der beste Weg, es zu tun?

Das erwartete Ergebnis ist:

{ 
     "id": 15, 
     "label": "Adeo", 
     "category": 7, 
     "cashflows": [ 
      { 
       "date": "2016-11-01", 
       "forecasted_value": "2000.00", 
       "edited_value": null, 
       "third_party": 15 
      }, 
      { 
       "date": "2017-01-01", 
       "forecasted_value": "4000.00", 
       "third_party": 15 
      } 
     ] 
    } 

Und das wird ein Read-Only-Serializer sein.

Antwort

3

der to_representation der Serializer Verwendung:

def to_representation(self, obj): 
    data = super().to_representation(obj) 
    # manipulate data['cashflows'] to group by month 
    return data 
+0

Dank, dies führt mich SO zu diesem Gold schreiben http://stackoverflow.com/questions/8746014/django-group-by-date-day-month-year – bixente57

Verwandte Themen