首页 > 解决方案 > Django更新一对多数组

问题描述

所以我得到这个错误直接分配到相关集合的反面是被禁止的。请改用 emails.set()。

这就是我的代码的样子

class Client(models.Model):

class Email(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='emails', null=True, blank=True)
    email = models.CharField(null=True, blank=True, max_length=50)

class EmailSerializer(serializers.ModelSerializer):
    class Meta:
        model = Emailfields = '__all__'

class ClientSerializer(serializers.ModelSerializer):
    emails = EmailSerializer(required=False, allow_null=True, many=True)

    def update(self, instance, validated_data):
        # Update all fields of Client.
        [setattr(instance, k, v) for k, v in validated_data.items()]
        instance.save()
        return instance

所以客户可以有很多电子邮件。当调用更新时,它说直接分配到相关集合的反面是被禁止的。请改用 emails.set()。

可以通过 let emailsData = valid_data.pop('emails', []) 从 valid_data 中删除电子邮件来避免此错误消息。

但是一旦完成,我不确定下一步要做什么来更新 emails 数组,如果它需要更新,或者如果它不再在 emailsData 数组中,则删除它。

json看起来像这样

{ id: 10, name: 'test', emails: [ { id: 1, emailType: 'Work', email: 'test@gmail.com', client_id: 10 } ] }

我有这个表格,如果客户有超过 1 封电子邮件,您可以在其中添加/删除电子邮件字段。因此,如果我添加另一个电子邮件行,而不设置电子邮件地址,则数组将被发送到包含它的 json。所以在 django 中,我检查电子邮件是否为空,不要插入。

这在创建时工作正常。但是,我的困境是在更新期间。如果电子邮件 id 相同,则更新它,否则如果为 0,则插入。如果用户决定删除他现有的电子邮件地址之一,我还需要检测要删除哪些电子邮件字段。

最简单的方法是删除所有并根据数组重新创建电子邮件条目,但我不希望这样,因为我不希望浪费 id 计数器。

想法?

标签: djangodjango-modelsdjango-rest-framework

解决方案


推荐阅读