如果组名冲突,则更新同一个组

2024-04-27 05:33:13 发布

您现在位置:Python中文网/ 问答频道 /正文

如果组用户的名称要与已创建的组创建匹配项,如何更新同一个组?如果我想更新而不是显示错误,我应该在哪里工作?是验证函数还是创建函数

这是我的序列化程序

class DeviceGroupSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source='token', format='hex', read_only=True)
    devices = DeviceIdSerializer(many=True)

    class Meta:
        model = DeviceGroup
        fields = ['id','name', 'devices',]

    def validate(self, data):
        errors = {}
        try:
            name = data['name']
            if not bool(name):
                #empty or null
                errors['name'] = 'Name cannot be empty'
        except KeyError:
            if not (self.instance and bool(self.instance.name)):
                errors['name'] = 'Name is required'

        if len(data.get('devices', [])) == 0:
            errors['devices'] = 'Device(s) should be specified.'

        if bool(errors):
            raise serializers.ValidationError(errors)
        return data

    def create(self, validated_data):
        # for create - there is always name; we have already checked that in validation
        # TODO Further check for group-name clash - if yes, update the same group
        owner = validated_data['owner']
        name = validated_data['name']
        group = DeviceGroup.objects.create(owner=owner, name=name)

        tokens = [d['token'] for d in validated_data['devices'] ]
        BaseDevice.objects.filter(token__in=tokens, owner=owner).update(group=group)
        return group

def update(self, instance, validated_data):
        # for update - there may or may not be name
        # if it does, it refers rename

        owner = validated_data['owner']
        name = validated_data.get('name', None)
        if not name is None:
            instance.update(name=name)

        tokens = [d['token'] for d in validated_data['devices'] ]
        BaseDevice.objects.filter(token__in=tokens, owner=owner).update(group=instance)
        return instance

Tags: instancenameinselftokenfordataif
1条回答
网友
1楼 · 发布于 2024-04-27 05:33:13

你想要^{}

A convenience method for updating an object with the given kwargs, creating a new one if necessary. The defaults is a dictionary of (field, value) pairs used to update the object.

根据您共享的内容,如果已经存在具有给定nameDeviceGroup所有者,则这看起来类似于以下内容:

    def create(self, validated_data):
        # for create - there is always name; we have already checked that in validation
        # TODO Further check for group-name clash - if yes, update the same group
        owner = validated_data['owner']
        name = validated_data['name']

        # created is a boolean telling us if a new DeviceGroup was created
        group, created = DeviceGroup.objects.update_or_create(name=name, defaults={'owner': owner})

        tokens = [d['token'] for d in validated_data['devices'] ]
        BaseDevice.objects.filter(token__in=tokens, owner=owner).update(group=group)
        return group

相关问题 更多 >