【发布时间】:2017-08-01 12:30:41
【问题描述】:
如果组用户的名称想要创建与已创建组匹配的组,我如何更新同一个组?如果我想更新而不是显示错误,我应该在哪里工作?它是在验证功能还是创建功能上?
这是我的序列化器
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
【问题讨论】:
-
您要更新
DeviceGroup还是BaseDevice? -
如果我已经有一个名为重要的组,并且我再次为设备“device2”创建了一个组,那么应该将 device2 移动到同一组。
标签: python django django-rest-framework