【问题标题】:How to create a child object in Serializer Django Rest?如何在 Serializer Django Rest 中创建子对象?
【发布时间】:2020-04-01 16:28:31
【问题描述】:

我有一个任务,我需要在这里返回这个json对象:

  {
    "id": "99999999",
    "point": "11111111",
    "name": "some name",

    "quantity": {
      "needed": "10",
      "done": "2",
    },

  }

我必须将quantity 字段作为子对象,但在Django 模型中quantity_neededquantity_done 不能是子对象。代码如下:

# model.py
class NeedModel(models.Model):
    article = models.ForeignKey(ArticleModel, on_delete=models.CASCADE)
    point = models.ForeignKey(PointModel, verbose_name="Hospital", on_delete=models.CASCADE)
    quantity_needed = models.PositiveIntegerField(default=0)
    quantity_done = models.PositiveIntegerField(default=0)

我尝试使用 to_representation 方法更改此设置,我的代码如下所示:

# serializer.py
class NeedsSerializer(ModelSerializer):

    class Meta:
        model = NeedModel
        fields = ('id', 'point')

    def to_representation(self, instance):
        data = super(NeedsSerializer, self).to_representation(instance)

        data['name'] = instance.article.name

        data['quantity'] = {
           'needed': instance.quantity_needed,
           'done': instance.quantity_done,
        },


        return data

但结果是,我得到了一个 quantity 字段,其中包含一个包含该对象的列表。如何摆脱这个列表?

{
    "id": 6,
    "point": 4,
    "name": "Бинт гіпсовий 20см х2,7м",

    "quantity": [
        {
            "needed": 12,
            "done": 0
        }
    ],

},

【问题讨论】:

    标签: python json django django-rest-framework serialization


    【解决方案1】:

    其实答案很简单。您需要按照应有的方式创建字典,然后使用update 方法

    def to_representation(self, instance):
        data = super(NeedsSerializer, self).to_representation(instance)
    
        data['name'] = instance.article.name
    
        q = {'quantity': {
           'needed': instance.quantity_needed,
           'done': instance.quantity_done,
        }}
    
        data.update(q)
        return data
    
    

    结果如下:

    {
        "id": 2,
        "point": 2,
        "name": "Захисний костюм",       
    
        "quantity": {
            "needed": 1000,
            "done": 40
        }
    },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2017-02-02
      相关资源
      最近更新 更多