gpt4 book ai didi

python - 抑制 Django REST 框架中的 "field should be unique"错误

转载 作者:太空狗 更新时间:2023-10-29 20:27:24 24 4
gpt4 key购买 nike

我有一个像这样的模型

class MyModel(models.Model):
uuid = models.CharField(max_length=40, unique=True)

和一个序列化器

class MyModelSerializer(serializers.ModelSerializer):    
class Meta:
model = MyModel
fields = ('uuid')

我想接收带有 MyModel 对象的 JSON,但它可以是现有对象。因此,当我将 serializer.is_valid() 与有关现有对象的数据一起使用时,它会给我一个错误:

for record in request['records']: 
# request - body of JSON request,
# 'records' - array of records I want to add or update

serializer = MyModelSerializer(data=record)
if serializer.is_valid():
# Do stuff
serializer.save()

错误:

 {"uuid":["This field must be unique."]}

有没有办法区分新对象和现有对象的行为?特别是,我想创建新的 MyModel 对象(如果它还不是数据库)并更新现有的 MyModel 对象(如果它存在)。

最佳答案

您基本上是通过尝试使用 POST 请求创建新实例和更新现有实例来重载 REST API 的单个入口点。此外,您似乎正试图在一个单个 POST 请求中同时创建和更新多个实例。

Django REST Framework (DRF) 期望 POST 请求仅创建新实例。因此,发送现有实例记录会触发 uuid 字段的唯一约束冲突,因为 DRF 会尝试将该记录创建为新实例,因为现有实例已经具有该 uuid 值。

让您的 REST API 更“RESTful”的解决方案是将记录的创建和更新分别分成 POST 和 PUT 请求。目前尚不清楚您是否使用 generic API views provided by DRF ,但您可以使用 CreateAPIView 来发布新实例,然后创建一个单独的 UpdateAPIView 来 PUT 和/或 PATCH 现有实例。更好的是,您可以使用通用 View ListCreateAPIViewRetrieveUpdateAPIView 允许通过 GET 对这两个端点进行检索。

最后,为了处理批量请求(即单个请求中的多个实例),您可以覆盖内置 View 方法或使用第 3 方包,例如 django-rest-framework-bulk .

关于python - 抑制 Django REST 框架中的 "field should be unique"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29247811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com