Как создать дочерний объект в Serializer Django Rest? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть задача, мне нужно вернуть этот json объект:

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

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

  }

У меня должно быть поле quantity в качестве дочернего объекта, но в модели Django quantity_needed и quantity_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
        }
    ],

},

1 Ответ

0 голосов
/ 01 апреля 2020

На самом деле ответ очень прост. Вам нужно создать словарь, как следует, а затем использовать метод 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
    }
},
...