Как добавить отношения в фикстуры Django, явно добавив поля объекта?

Я работаю с Django Framework. У меня есть две модели: Component и ComponentProperty.

class Component(models.Model):
    name = models.CharField(unique=True, max_length=255)
    component_properties = models.ManyToManyField(ComponentProperty)

class ComponentProperty(models.Model):
    label = models.CharField(unique=True, max_length=255)
    component_type = models.CharField(max_length=255)

И сериализаторы:

class ComponentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Component
        fields = ('name', 'component_properties')
        depth = 1

class ComponentPropertySerializer(serializers.ModelSerializer):
    class Meta:
        model = ComponentProperty
        fields = ('label', 'component_type')

Я пытаюсь загрузить данные с приборами. Я написал и файл приспособления, который выглядит так:

[
   {
      "pk":1,
      "model":"api.componentproperty",
      "fields":{
         "label":"label",
         "component_type":"text"
      }
   },
   {
      "pk":2,
      "model":"api.componentproperty",
      "fields":{
         "label":"description",
         "component_type":"text",

      }
   },
   {
      "pk":1,
      "model":"api.component",
      "fields":{
         "name":"text",
         "component_properties":[
            1,
            2
         ]
      }
   }
]

Это нормально! Но мне нужно загрузить 20 приборов. Я хочу, чтобы приспособление (например, component.json) выглядело следующим образом:

[
   {
      "pk":null,
      "model":"api.component",
      "fields":{
         "name":"text",
         "component_properties":[
            {
               "pk":null,
               "model":"api.componentproperty",
               "fields":{
                  "label":"label",
                  "component_type":"text"
               }
            },
            {
               "pk":null,
               "model":"api.componentproperty",
               "fields":{
                  "label":"description",
                  "component_type":"text",

               }
            }
         ]
      }
   }
]

Вишенкой на торте должны быть приспособления, указывающие первичный ключ, например здесь. Пожалуйста, кто-нибудь может помочь мне написать эти фикстуры без pk и отношений, описанных выше?


person Junior Gantin    schedule 16.08.2017    source источник
comment
что произойдет, если вы опустите pk или установите его на null?   -  person Jahongir Rahmonov    schedule 16.08.2017
comment
django.core.serializers.base.DeserializationError: проблема с установкой устройства. 'default_value': 'string', 'data': [], 'label': 'label'}}' значение должно быть целым числом.]: (api.component:pk=None) field_value было '{'pk': Нет, 'модель': 'api.componentproperty', 'поля': {'component_type': 'текст', 'значение по умолчанию': 'строка', 'данные': [], 'метка': 'метка'}}'   -  person Junior Gantin    schedule 16.08.2017
comment
Я пытаюсь, чтобы файл приспособления выглядел так: component.json   -  person Junior Gantin    schedule 16.08.2017
comment
Можете ли вы добавить свой serializers.py к вопросу?   -  person wencakisa    schedule 16.08.2017
comment
@wencakisa Готово!   -  person Junior Gantin    schedule 16.08.2017


Ответы (1)


Насколько я понял, вы хотите выполнить вложенную сериализацию Component properties в файл ComponentSerializer.

Это можно сделать, если вы используете свой ComponentPropertySerializer внутри своего ComponentSerializer:

class ComponentPropertySerializer(serializers.ModelSerializer):
    class Meta:
        model = ComponentProperty
        fields = ('label', 'component_type')


class ComponentSerializer(serializers.ModelSerializer):
    # Django REST Framework supports nested serialization
    # You serialize your *component_properties* with your ComponentPropertySerializer
    # As they are many properties, you use *many=True*

    component_properties = ComponentPropertySerializer(many=True, read_only=True)

    class Meta:
        model = Component
        fields = ('name', 'component_properties')
        depth = 1

Я думаю, что это должно воспроизвести желаемый результат. Вложенная сериализация очень полезна и хорошо задокументирована в Django REST. Документация по фреймворку.

person wencakisa    schedule 16.08.2017
comment
Спасибо за помощь. На самом деле, то, что я хотел бы сделать, это загрузить исходные данные в базу данных. Я выбрал приспособления, чтобы сделать это. То, что я пытаюсь сделать, это создать файл приборов, как указано выше (второй файл json). - person Junior Gantin; 16.08.2017