2016-02-16 17 views
5

Prima di tutto, non si tratta di creare o aggiornare oggetti di nidificazione, ma solo di impostarli. Consente di utilizzare il seguente esempio: ho i seguenti modelli:Come impostare l'oggetto nidificato nel framework django rest?

class Category(models.Model): 
    code= models.CharField(max_length=2) 
    name= models.CharField(max_length=100) 

class Question(models.Model): 
    category= models.ForeignKey(Category, related_name='categories') 
    title = models.CharField(max_length=100) 

ei seguenti serializzatori:

class CategorySerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Category 
     fields = ('code', 'name') 

class QuestionSerializer(serializers.ModelSerializer): 
    category= CategorySerializer() 

    class Meta: 
     model = Question 
     fields = ('category', 'title') 

Ora, quando get un Question, la sua fine funziona come previsto: ricevo i campi di domanda con i campi categoria come previsto.

Il problema che ho è quando voglio post un Question solo avendo la Category.code, io non sono davvero sicuro di come impostare/utilizzare un Category esistente. Ho provato diversi modi, ma nessuno di loro ha funzionato.

Se rimuovo category= CategorySerializer() sulla QuestionSerializer e passo il id (pk) del Category nella mia richiesta, che si sta lavorando, l'Question viene salvato con il relativo Category.

C'è un modo per indicare come serializzare l'oggetto nidificato?

Grazie in anticipo per qualsiasi commento/consiglio/soluzione.

+0

Eventuali duplicati di [Django REST quadro: creare e aggiornare un oggetto con un valore oggetto annidato (anziché chiave primaria)] (http://stackoverflow.com/questions/35181118/django-rest-framework-create-and-update-an-object-with-a-ested-object-value-i) – bakkal

risposta

1

Non sono sicuro, se ho capito. A me sembra che si tratti di creare Question, giusto?

È possibile sovrascrivere il metodo di QuestionSerializer

class QuestionSerializer(serializers.ModelSerializer): 
    category= CategorySerializer() 

    class Meta: 
     model = Question 
     fields = ('category', 'title') 

    def create(self, validated_data): 
     category = validated_data.pop('category') 
     category_obj = Category.objects.get(code=category['code']) 

     return self.Meta.model.objects.create(category=category, **validated_date) 

create Forse si hanno anche per impostare il campo name in CategorySerializer-read_only

+0

Ho specificamente detto che non si tratta di creare o aggiornare un nido ed oggetto nella mia prima frase. si tratta di usare uno esistente. –

+0

@storm_buster Ecco cosa fa questa risposta (la mia copre entrambi i casi). Crea una nuova _Question_, ma eseguirà una query per trovare una _Category_ esistente da allegare all'istanza di Domanda. – bakkal

+0

@storm_buster quando i dati 'post' vengono chiamati il ​​metodo' create' di un serializzatore. O intendi una richiesta 'PATCH/PUT'? Quindi dovresti fare una cosa simile come descritto sopra con il metodo 'update'. – ilse2005