Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果组名冲突,请更新同一组_Python_Django_Django Rest Framework - Fatal编程技术网

Python 如果组名冲突,请更新同一组

Python 如果组名冲突,请更新同一组,python,django,django-rest-framework,Python,Django,Django Rest Framework,如果组用户的名称要与已创建的组创建匹配项,如何更新同一组?如果我想更新而不是显示错误,我应该在哪里工作?是验证函数还是创建函数 这是我的序列化程序 class DeviceGroupSerializer(serializers.ModelSerializer): id = serializers.UUIDField(source='token', format='hex', read_only=True) devices = DeviceIdSerializer(many=Tru

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

这是我的序列化程序

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
你想要:

使用给定KWARG更新对象的简便方法, 如有必要,创建一个新的。默认值是一本字典 (字段,值)用于更新对象的对

根据您共享的内容,如果具有给定
名称的
设备组
已经存在,则假设您要更新
设备组
上的所有者,则这看起来类似于以下内容:

    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

您想要更新设备组还是基本设备?如果我已经有一个名为重要的组,并且我再次为设备“device2”创建了一个组,那么设备2应该移动到同一个组。如果我有更新功能,是否最好在创建功能或更新中处理名称冲突?我有一个名为device1的设备,设备2,其中设备1位于重要组中,当我单击设备2并创建新的重要组时,设备2应移动到已创建的重要组,而不是创建具有相同名称的另一个组。这是我的代码中的错误。它现在正在工作。不过,有一个问题是,如果我现在创建一个重要组,那么设备将被移动到已创建的名为重要组的组,而不是创建另一个重要组。但是如果我创建了一个重要的组,它就会创建一个新的组。如何处理大小写问题?解决这一问题的最快方法是执行类似
group\u exists=DeviceGroup.objects.filter(name\uu iexact=name.exists()
或使用
try:catch
块,在该块中尝试获取
DeviceGroup
(使用
name\uu iexact
),如果引发了
DeviceGroup.DoesNotExist
,只需创建它。您也可以查看一些,但它们比修改查询要复杂一些。我理解这一点,也感谢您提供了信息丰富的解决方案。