2014-11-19 6 views
6

Sono un po 'nuovo al DRF. Ho modello di record che assomiglia a questo:Django Rest Framework come salvare un modello con campo correlato basato su 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) 

    ... 

Il RecordSerializer è questa:

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") 

E questa è la vista:

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

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

La richiesta POST viene inviata da Backbone e include un campo con l'ID attività, ad esempio "{attività: 12}". Cosa devo fare se voglio che la vista salvi il Record e imposta l'attività sull'attività con l'ID di 12?

risposta

2

Django REST Framework provides a PrimaryKeyRelatedField esattamente per questo caso d'uso.

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") 

Questo produrrà un risultato simile a quello che stai cercando, e la volontà di accettare la id dell'attività quando si vuole aggiornarlo.

+1

Grazie per la tua risposta, riferimento molto utile. Lo accetterò non appena avrò la visione funzionante. In questo momento sto cercando di risolvere un altro errore, l'ho postato su questa domanda, forse puoi darmi una mano anche lì: http://stackoverflow.com/questions/27030449/django-rest-framework-modelfield-requires- modello-campo-kwarg. – alejoss

17

La risposta accettata era vero per DRF v2.x ma is no longer for newer (3.x) versions, come sarebbe alzare questo AssertionError:

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

Per le versioni più recenti, basta aggiungere l'argomento queryset ad esso:

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