【问题标题】:How to use update_or_create when updating values in Django database from CSV files从 CSV 文件更新 Django 数据库中的值时如何使用 update_or_create
【发布时间】:2020-03-18 19:11:32
【问题描述】:

问题总结:我不明白 Django 中 objects.update_or_create 的语法。

CSV 文件的字段名称位于第一行:

# data.csv
field1, field2,
12, 14,
35, 56,

我在 models.py 中有一个用于我的 postgresql 数据库的模型:

from django.db import models
# example model, real one has 100 fields of different types
class MyModel(models.Model):
    field1 = models.IntegerField(blank=True, null=True)
    field2 = models.IntegerField(blank=True, null=True)

现在我想在新数据以 CSV 文件形式出现时创建/更新数据库:

import csv
with open('./datafiles/data.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        update, created = MyModel.objects.update_or_create(
            defaults={???},
            ???
        )

    update.save()

问号标记的地方是什么?

文档说this

【问题讨论】:

  • MyModel 的唯一标识符是什么?
  • 不确定。我的模型中是否需要“id = models.UUIDField...”之类的东西?
  • 不,你没有。通常会使用它们,因此您不会在数据库中遇到重复项。

标签: python django csv django-models


【解决方案1】:

根据documentation

obj, created = Person.objects.update_or_create(
    first_name='John', last_name='Lennon',
    defaults={'first_name': True},
)

如果 John Lennon 已经存在,那么名字将更改为 Bob。如果它不存在,则会创建一个名为 Bob Lennon 的人。这可以处理更新现有记录的情况以及需要在一行中创建它的情况。

对于您的情况,您需要确定您在哪些字段上查找记录,以及您将根据该查找更新哪些字段。通常,查找字段是 slug 或一些独特字段的组合。

请阅读文档以充分了解问题以及向模型添加唯一(非 pk)字段或唯一字段组的潜在必要性。

【讨论】:

  • 啊,所以 **kwargs 部分仅用于初始化,但不是必需的。我只需要更新/创建。所以我可以只使用“ MyModel.objects.update_or_create(defaults={'field1': row[field1]},) ”吗?
  • 没有。 kwargs 部分是必需的。默认值是可选的。
  • 好的,那么我可以在 **kwargs 中使用默认起始值​​初始化所有现有字段,然后每次文件中有新字段时使用默认值进行更新?
  • 我不知道。我需要一个具体的例子来更好地理解你想要做什么。
猜你喜欢
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2019-02-19
相关资源
最近更新 更多