get_or_create() 问题

Posted

技术标签:

【中文标题】get_or_create() 问题【英文标题】:get_or_create() question 【发布时间】:2010-07-12 04:22:50 【问题描述】:

从官方文档中我无法理解默认参数是什么。

obj, created = Person.objects.get_or_create(first_name='John', last_name='Lennon',
                  defaults='birthday': date(1940, 10, 9)

这是否意味着它将查找与JohnLennon 参数匹配的字段,并且仅插入生日?我可以使用其他东西代替默认值吗?

我应该使用什么方法来清理表(模型)中的所有字段?

它给我 FileField 错误无法解析字段中的关键字默认值

所以我需要寻找字段,如果我找到了 - 更新数据。如果我没有找到它,我必须创建新字段...但是,据我了解,当找到现有字段时,它不会更新我的默认字段。

【问题讨论】:

【参考方案1】:

很明显——如果get_or_create 找到查询对象,defaults keword 什么也不做。但如果它创建对象,则存储在obj 中的实例具有birthday 字段(在您的示例中)填充了相应的值。您可以将任何字典作为defaults 传递,只要它的键是您正在查询的模型的有效字段名称。

要清理整个表,你应该使用类似的东西:

Model.objects.all().delete()

相当于:

DELETE FROM app_model WHERE True;

要在每个对象中设置一些字段(每行中的一些列),有update()方法:

Model.objects.all().update( some_field = "" )

翻译为:

UPDATE app_model SET `some_field` = '' WHERE True;

我的 sql 有点生疏了,但我相信或多或少会这样。

【讨论】:

所以它不适合我。因为我需要寻找具有正确名称的字段。如果我找到它,我需要更新其他字段,但如果我没有找到它,我必须创建它结束写入所有字段。【参考方案2】:

您可以参考this django 文档以获取有关 get_or_create 方法的更详细说明。简而言之,它首先尝试获取提供的 first_name 和 last_name,如果没有,它会实例化并保存一个新对象,在这种情况下使用默认字典。并且返回值是对应的对象和True/False是否创建了新对象。

【讨论】:

它给我 FileField 错误无法解析字段中的关键字默认值 它应该是默认值,而不是默认值(注意缺少's')【参考方案3】:

你可以使用任何东西。如果您没有设置任何内容,则默认为。

【讨论】:

这本词典是什么意思?里面的参数会做什么? 这个叫做关键字参数,它将调用参数匹配到参数名称调用的函数。

以上是关于get_or_create() 问题的主要内容,如果未能解决你的问题,请参考以下文章

正确使用 get_or_create?

Django - SQL 批量 get_or_create 可能吗?

使用 get_or_create 返回的 MultipleObjects

SQLAlchemy 是不是与 Django 的 get_or_create 等效?

SQLAlchemy 是不是与 Django 的 get_or_create 等效?

django - 使用 get_or_create 自动创建用户时设置用户权限