我已经编写了自己的批量save()
,因为我无法使用save()
的内部ListSerializer
方法来调用相关方法(create()
& {{ 1}})取决于查询负载。该模型名为update()
,其主键为Product
。当我使用uuid
kwarg调用Product的绑定save()
方法时,我得到:
ValueError:此模型中不存在以下字段,或者是m2m字段:uuid
这是updated_fields
:
save()
这是追溯的相关尾部部分:
文件“/my/app/views/API/product.py”,第162行,在partial_update中 serializer.save()
文件“/my/app/views/API/serializers.py”,第72行,保存 update_fields = [k代表k,v代表obj.items()]
文件“/lib/python3.5/site-packages/django/db/models/base.py”,第792行,保存 %','。join(non_model_fields))
ValueError:此模型中不存在以下字段,或者是m2m字段:uuid
以下是def save(self):
instances = []
result = []
# Note self.validated_data is a list of multiple OrderedDicts representing
# the json of Product fields. Depending on the request, they will either
# have uuids (so we will update these instances), or won't and hence
# require creation.
for obj in self.validated_data:
uuid = obj.get('uuid', None)
if uuid:
instance = get_object_or_404(Product, uuid=uuid)
update_fields = [k for k,v in obj.items()]
for k, v in obj.items():
setattr(instance, k, v)
instance.save(update_fields=update_fields)
result.append(instance)
else:
instances.append(Product(**obj))
Product.objects.bulk_create(instances)
result += instances
return result
定义的相关部分:
Product
所以,它不是m2m,并且该字段确实存在。那么这个错误的原因是什么?
答案 0 :(得分:2)
错误来自this line,其中Django将您提供的update_fields
与模型字段进行比较。
if non_model_fields:
raise ValueError("The following fields do not exist in this "
"model or are m2m fields: %s"
% ', '.join(non_model_fields))
不幸的是,错误消息有点误导,因为primary_key=True
的所有字段(例如uuid
字段)are filtered out都在m2m
旁边。
update_fields = frozenset(update_fields)
field_names = set()
for field in self._meta.fields:
if not field.primary_key:
field_names.add(field.name)
...
non_model_fields = update_fields.difference(field_names)
这就是non_model_fields
不为空且引发异常的原因。
要解决您的问题,您需要在保存之前从uuid
删除obj
密钥。
...
obj.pop('uuid') # only if mutating validated_data doesn't bother you
update_fields = [k for k,v in obj.items()]
for k, v in obj.items():
setattr(instance, k, v)
instance.save(update_fields=update_fields)
result.append(instance)
顺便说一下,你不需要这个列表理解来获得update_fields
- 你可以使用obj.keys()
来得到相同的结果。
答案 1 :(得分:0)
由于在 django 中使用了错误的字段名(列名)而发生