使用 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