【问题标题】:Foreign key serializer update method外键序列化器更新方法
【发布时间】:2018-05-08 17:59:11
【问题描述】:

我有以下型号:

class Card(models.Model):
    thing = models.CharField(max_length=50, blank=True, null = True, )

class Responsibility(models.Model):
    name = models.CharField(max_length=50, blank=True, null=True, )
    card = models.ForeignKey(Card, related_name='responsibilities', blank=True, null=True, on_delete=models.CASCADE)

class Collaborator(models.Model):
    name = models.CharField(max_length=50, blank=True, null=True, )
    card = models.ForeignKey(Card, related_name='collaborators', blank=True, null=True, on_delete=models.CASCADE)

还有我的序列化器:

class CollaboratorSerializer(serializers.ModelSerializer):

    class Meta:
        model = Collaborator
        fields = '__all__'

class ResponsibilitySerializer(serializers.ModelSerializer):
    class Meta:
        model = Responsibility
        fields = '__all__'      


class CardSerializer(serializers.ModelSerializer):

    responsibilities = ResponsibilitySerializer(many=True,)
    collaborators = CollaboratorSerializer(many=True,)

    class Meta:
        model = Card
        fields = '__all__'

    def create(self, validated_data):
        responsibilities_data = validated_data.pop('responsibilities')
        collaborators_data = validated_data.pop('collaborators')

        card = Card.objects.create(**validated_data)
        for responsibility_data in responsibilities_data:
            Responsibility.objects.create(card=card, **responsibility_data)
        for collaborator_data in collaborators_data:
            Collaborator.objects.create(card=card, **collaborator_data)
        return card

创建和获取成功,我不知道如何为 Card 实现 update() 方法。示例 request.data 如下所示:

{u'collaborators': [{u'id': 8, u'card': 12, u'name': u''}, {u'name': u''}, {u'name': u''}], u'responsibilities': [{u'name': u'Name'}, {u'name': u'Age'}, {u'name': u'Address'}], u'id': 12, u'thing': u'Reader'}

在我的更新方法中,我想首先删除该特定卡的所有职责和合作者,然后从收到的数据中重新创建。

到目前为止我所拥有的:

def update(self, instance, validated_data):
    instance.responsibilities.all().delete()
    instance.collaborators.all().delete()
    .. NOT SURE ABOUT THIS PART ..

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以覆盖 ModelSerializer 的 update 方法

    class CardSerializer(serializers.ModelSerializer):
    
        ...
    
        def update(self, instance, validated_data):
            # do stuff here
            instance.collaborators.all().delete()
            instance.responsibilities.all().delete()
    
            res = validated_data.get('responsibilities', [])
            aList = [Responsibility(**vals) for vals in res]
            Responsibility.objects.bulk_create(aList)
    
            # same goes for collaborators
    

    【讨论】:

    • 不确定实际的逻辑
    • 我更新了答案,您也可以使用与在 create 方法中创建 Responsibility 和 Collaborator 对象相同的逻辑
    【解决方案2】:

    这个链接https://github.com/encode/django-rest-framework/blob/master/docs/topics/writable-nested-serializers.md可以帮助你。这个包非常适合在序列化程序中更新和创建相关字段,而无需覆盖方法。希望对你有用

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 2019-10-11
      • 2018-07-05
      相关资源
      最近更新 更多