【问题标题】:django rest framework update nested serializer by iddjango rest框架按id更新嵌套序列化器
【发布时间】:2021-07-19 15:33:16
【问题描述】:

如何通过 id 更新嵌套序列化程序中的列表

我有一个用户有多个联系人

例子:

联系序列化器

class ContactSerializer(serializers.ModelSerializer):
    class Meta:
        model = Contact
        fields = [
            'id',
            'name',
            'last_name'
        ]

用户序列化器

class UserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(
        required=True,
        validators=[
            UniqueValidator(queryset=User.objects.all())
        ]
    )
    contacts = ContactSerializer(many=True)

    class Meta:
        model = User
        fields = [
            "email",
            "contacts"
        ]


    def update(self, instance, validated_data):
        contacts_data = validated_data.pop('contacts')
        contacts = (instance.contacts).all()
        contacts = list(contacts)
        instance.name = validated_data.get('name', instance.name)
        instance.save()

        # many contacts
        for contact_data in contacts_data:
            contact = contacts.pop(0)
            contact.name = contact_data.get('name', contact.name)
            contact.last_name = contact_data.get('last_name', contact.last_name)
            contact.save()

        return instance

我想按 ID 更新联系人,现在可以了,但它只更新列表中的第一个联系人

例如我想更新 ID 为 4 和 6 的联系人

负载请求

{
    "name": "string",
    "contacts": [
        {
            "id": 4, 
            "name": "string",
            "last_name": "string"
        },
        {
            "id": 6, 
            "name": "string",
            "last_name": "string"
        }
    ]
}

有什么想法或建议吗?

【问题讨论】:

  • 你是如何发送联系人的?你的要求是什么?显示您发送到序列化程序的数据示例
  • @Jimmar 我更新了问题

标签: python django django-rest-framework


【解决方案1】:

这样试试

def update(self, instance, validated_data):
        contacts_data = validated_data.pop('contacts')

        instance.name = validated_data.get('name', instance.name)
        instance.save()

        # many contacts
        for contact_data in contacts_data:
            contact = Contact.objects.get(pk=contact_data['id']) # this will crash if the id is invalid though
            contact.name = contact_data.get('name', contact.name)
            contact.last_name = contact_data.get('last_name', contact.last_name)
            contact.save()

        return instance

【讨论】:

  • 工作,谢谢,稍作改动,contact_data 是 OrderedDict:contact_data['id']
  • @Alex 我更新了答案以包括,如果这确实回答了您的问题,那么考虑将其选为正确答案(投票按钮下的复选标记)
猜你喜欢
  • 2018-12-13
  • 2021-06-23
  • 2015-02-17
  • 2016-08-01
  • 2014-07-26
  • 2014-07-19
  • 1970-01-01
  • 2019-10-13
相关资源
最近更新 更多