2016-02-16 2 views
5

Прежде всего, речь идет не о создании или обновлении объектов вложенности, а только об их установке. позволяет использовать следующий пример: У меня есть следующие модели:Как установить вложенный объект в рамки 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) 

и следующие сериализаторы:

class CategorySerializer(serializers.ModelSerializer): 

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

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

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

Теперь, когда я getQuestion, его прекрасно работают, как ожидалось: Я получаю поле вопроса с полями категорий, как ожидалось.

Проблема, что у меня есть, когда я хочу postQuestion только имея Category.code, я не совсем уверен, как установить/использовать существующий Category. Я пытался по-разному, но никто из них не работал.

Если удалить category= CategorySerializer() на QuestionSerializer и я прохожу id (pk) в Category в моей просьбе, чем он работает, Question сохраняется с соответствующей Category.

Есть ли способ указать, как сериализовать вложенный объект?

Заранее благодарю за любые комментарии/рекомендации/решения.

+0

Возможные дубликатом [Django REST Framework: создание и обновление объекта с вложенное значение объекта (вместо основного ключа)] (http://stackoverflow.com/questions/35181118/django-rest-framework-create-and-update-an-object-with-a-nested-object-value-i) – bakkal

ответ

1

Я не уверен, если у меня это получилось. Мне кажется, что речь идет о создании Question, правильно?

Вы можете перезаписать create метод 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) 

Может быть, вы также должны установить поле name в CategorySerializer к read_only

+0

Я специально сказал, что речь идет не о создании или обновлении гнезда ed в моем первом предложении. речь идет об использовании существующего. –

+0

@storm_buster Вот что делает этот ответ (мой охватывает оба случая). Он создает новый _Question_, но запрашивает, чтобы найти существующую _Category_ для присоединения к экземпляру Question. – bakkal

+0

@storm_buster, когда вы отправляете данные, вызывается метод 'create' сериализатора. Или вы имеете в виду запрос «PATCH/PUT»? Затем вы должны выполнить аналогичную процедуру, описанную выше, с помощью метода 'update'. – ilse2005

Смежные вопросы