【问题标题】:Updating existing models with Django Rest Framework Serializers使用 Django Rest Framework 序列化程序更新现有模型
【发布时间】: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]) 然后修改值并保存。

标签: python django csv django-rest-framework


【解决方案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()

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多