2014-11-19 4 views
6

zu speichern Ich bin irgendwie neu in DRF. Ich habe Rekord Modell, das wie folgt aussieht:Django Rest Framework, wie ein Modell mit verwandtem Feld basierend auf ID

class Records(models.Model): 
    owner = models.ForeignKey(User, null=True) 
    activity = models.ForeignKey(Activity, null=True) 
    time_start = models.DateTimeField(null=True) 
    time_end = models.DateTimeField(null=True) 

    ... 

Die RecordSerializer ist dies:

class RecordSerializer(serializers.ModelSerializer): 

    now = datetime.today() 
    owner = serializers.Field(source='owner.username') 
    time_start = serializers.DateTimeField(source='now') 

    class Meta: 
     model = Records 
     fields = ("owner", "activity", "time_start") 

Und dies ist die Ansicht:

class StartApiView(generics.CreateAPIView): 
    model = Records 
    serializer_class = RecordSerializer 

    def pre_save(self, obj): 
     obj.owner = self.request.user 

Die POST-Anforderung wird von Backbone gesendet und Es enthält ein Feld mit der Aktivitäts-ID, zum Beispiel "{activity: 12}". Was soll ich tun, wenn ich möchte, dass die Ansicht den Datensatz speichert und die Aktivität auf die Aktivität mit der ID 12 setzt?

Antwort

2

Django REST Framework provides a PrimaryKeyRelatedField für genau diesen Anwendungsfall.

class RecordSerializer(serializers.ModelSerializer): 
    activity = serializers.PrimaryKeyRelatedField() 
    owner = serializers.CharField(read_only=True, source='owner.username') 
    time_start = serializers.DateTimeField(source='now') 

    class Meta: 
     model = Records 
     fields = ("owner", "activity", "time_start") 

Dies wird eine Ausgabe ähnlich zu produzieren, was Sie suchen, und es wird die id der Aktivität akzeptieren, wenn Sie es aktualisieren möchten.

+1

Vielen Dank für Ihre Antwort, sehr nützliche Referenz. Ich werde es akzeptieren, sobald ich die Ansicht funktioniere. Im Moment versuche ich einen weiteren Fehler zu lösen, ich habe ihn auf diese Frage gepostet, vielleicht kannst du mir auch helfen: http://stackoverflow.com/questions/27030449/django-rest-framework-modelfield-requires- Modellfeld-Kwarg. – alejoss

17

Die akzeptierte Antwort galt für DRF v2.x aber is no longer for newer (3.x) versions, da es diese AssertionError erhöhen würde:

AssertionError: Relational field must provide a queryset argument, or set read_only=True .

Für neuere Versionen, fügen Sie einfach den queryset Argument hinzu:

class RecordSerializer(serializers.ModelSerializer): 
    activity = serializers.PrimaryKeyRelatedField(queryset=Activity.objects.all()) 
    // [...] 
Verwandte Themen