【问题标题】:How to add relationships in Django fixtures by explicitly adding object's fields?如何通过显式添加对象的字段在 Django 固定装置中添加关系?
【发布时间】:2018-01-24 11:42:39
【问题描述】:

我正在使用 Django 框架。我有两个模型: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 个装置要加载。我想让fixture(例如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",

               }
            }
         ]
      }
   }
]

锦上添花的必须是指定主键的固定装置,如here。拜托,谁能帮我写这些没有 pk 和上述关系的夹具?

【问题讨论】:

  • 如果省略 pk 或将其设置为 null 会发生什么?
  • django.core.serializers.base.DeserializationError: 安装夹具组件时出现问题.json': ["'{'pk': None, 'model': 'api.componentproperty', 'fields': {'component_type': 'text', 'default_value': 'string', 'data': [], 'label': 'label'}}' 值必须是整数。"]: (api.component:pk=无)field_value 为 '{'pk': None, 'model': 'api.componentproperty', 'fields': {'component_type': 'text', 'default_value': 'string', 'data': [], '标签':'标签'}}'
  • 我正在尝试让夹具文件看起来像:component.json
  • 您可以将您的serializers.py 添加到问题中吗?
  • @wencakisa 完成!

标签: django django-models django-rest-framework django-serializer django-fixtures


【解决方案1】:

据我了解,您希望在您的ComponentSerializer 中执行Component properties嵌套序列化

如果你在你的ComponentSerializer 中使用你的ComponentPropertySerializer 可以做到这一点:

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 Framework's docs 中有详细记录。

【讨论】:

  • 感谢您的帮助。事实上,我想做的是将初始数据加载到数据库中。我选择了固定装置来做到这一点。我想要做的是像上面一样创建固定文件(第二个 json 文件)。
猜你喜欢
  • 1970-01-01
  • 2021-04-02
  • 2017-05-23
  • 1970-01-01
  • 2016-09-27
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多