Python 使用get_或create的正确方法?

Python 使用get_或create的正确方法?,python,django,Python,Django,我正在尝试对表单中的某些字段使用get_或_create,但在尝试这样做时出现了500个错误 其中一行如下所示: customer.source = Source.objects.get_or_create(name="Website") customer.source,created = Source.objects.get_or_create(name="Website") 以上代码的错误是: Cannot assign "(<Source: Website>, False)

我正在尝试对表单中的某些字段使用get_或_create,但在尝试这样做时出现了500个错误

其中一行如下所示:

customer.source = Source.objects.get_or_create(name="Website")
customer.source,created = Source.objects.get_or_create(name="Website")
以上代码的错误是:

Cannot assign "(<Source: Website>, False)": "Customer.source" 
   must be a "Source" instance.
无法分配“(,False)”:“Customer.source”
必须是“源”实例。

获取或创建
返回元组

customer.source, created = Source.objects.get_or_create(name="Website")
从文件中:

说明: 要评估相似性的字段必须在默认值之外提及。其余字段必须包含在默认值中。如果发生CREATE事件,将考虑所有字段

看起来您需要返回一个元组,而不是单个变量,请执行以下操作:

customer.source = Source.objects.get_or_create(name="Website")
customer.source,created = Source.objects.get_or_create(name="Website")

您遇到的问题是
get\u或\u create
的一个文档化功能

使用关键字参数而不是“defaults”时,
get\u或\u create
的返回值是一个实例。这就是它在返回值中显示参数的原因

您可以使用
customer.source=source.objects.get\u或\u create(name=“Website”)[0]
获取正确的值

以下是文档的链接: 返回一个元组:

customer.source, created  = Source.objects.get_or_create(name="Website")
  • 已创建
    有一个布尔值,无论是否创建

  • customer.source
    的对象为
    get\u或\u create()
    方法


在@Tobu-answer和@mipadi-comment之后,如果我对创建的标志不感兴趣,我会以一种更为通俗的方式使用:

customer.source, _ = Source.objects.get_or_create(name="Website")

get\u或create方法实际上会返回一个元组

get_或_create方法的诀窍在于它实际返回(object,created)的元组。第一个元素是您试图检索的模型的实例,第二个元素是一个布尔标志,用于指示实例是否已创建。True表示该实例是由get_或_create方法创建的,False表示该实例是从数据库中检索到的

因此,您可以执行一些操作,例如获取源实例

 ```   customer.source = Source.objects.get_or_create(name="Website")[0]
 ```

或者,如果您不关心布尔标志:
customer.source=source.objects.get\u或\u create(name=“Website”)[0]
@mipadi,我更喜欢
customer.source、\u=source.objects.get\u或\u create(name=“Website”)
,因为它使返回元组的事实更加明显,有助于避免将来出现错误。FYI created是一个布尔值。如果创建,则为True;如果获取,则为False附加的
save()
是多余的吗?@zypro它就像
create()
,创建对象并一步保存,不需要任何
save()