使用 Django Rest Framework 序列化程序更新现有模型

Posted

技术标签:

【中文标题】使用 Django Rest Framework 序列化程序更新现有模型【英文标题】:Updating existing models with Django Rest Framework Serializers 【发布时间】:2015-07-06 15:22:04 【问题描述】:

我正在尝试通过定期更新的 CSV 更新大量模型。现在,CSV 的初始上传就像一个魅力,所有模型都正确写入数据库。但是,当我在创建模型后尝试更新模型时,我的 serializer.is_valid() 返回错误 ReturnDict([('inventory_number', [u'This field must be unique.'])])

因此我的问题是:如何更新已通过序列化程序创建的模型?

models.py:

class MyModel(models.Model):
    inventory_number = models.IntegerField(primary_key=True)
    location = models.CharField(max_length=40, blank=True)

views.py:

file_obj = request.data['file']

lines = csv.reader(file_obj, delimiter=",")
for line in lines:
    data = 
        'inventory_number': line[0],
        'location': line[1]
    

    serializer = self.serializer_class(data=data)
    if serializer.is_valid():
        MyModel.objects.save_model(**serializer.validated_data)
    else:
        print serializer.errors

最后,我对 Django 和 Django-Rest-Framework 还比较陌生,因此对于使用序列化程序的任何见解/技巧都值得赞赏。感谢您的宝贵时间。

【问题讨论】:

您正在尝试使用此代码创建新对象。您需要 some_obj = MyModel.objects.get(line[0]) 然后修改值并保存。 【参考方案1】:

首先尝试获取现有实例,如果存在则更新它,否则创建它。 这个post 可能会有所帮助 解决方案如下所示:

if serializer.is_valid():
        myinst, created = MyModel.objects.get_or_create(**serializer.validated_data)
        myinst.save()

你可能想让你的方法更简单:

for line in lines:
    myinst, created = MyModel.objects.get_or_create(inventory_number = line[0])
    myinst.location = line[1]
    myinst.save()

【讨论】:

以上是关于使用 Django Rest Framework 序列化程序更新现有模型的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证

18-Django REST framework-使用Django开发REST 接口

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers

django rest framework中文介绍

使用 django-rest-framework-simplejwt 注册后返回令牌