尝试保存在DRF

时间:2017-08-03 19:25:30

标签: python django django-rest-framework

我已经编写了自己的批量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,并且该字段确实存在。那么这个错误的原因是什么?

2 个答案:

答案 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 中使用了错误的字段名(列名)而发生