如何使用get_or_create在django中定义默认的ForeignKey对象?

时间:2015-12-26 00:17:36

标签: python django database

我想要关联两个模型:用户和组。 每个用户都属于一个组。我试图在get_or_create()中使用

创建默认用户
#include<bvector.h>
#include<iostream>
 .....

但它引发了以下错误:

  

(fields.E300)字段定义与模型“组”的关系,该组未安装或是抽象的。

我该怎么做才能解决这个问题?

每个用户必须具有非空组值。所以我读过这个get_or_create()方法。但我也看到它可以返回多个对象......而且我不希望它发生。我考虑过创建一个唯一的名称参数,但它有更好的解决方案吗?

你能帮助我吗?感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

可在此处找到更全面的答案:How to set a Django model field's default value to a function call / callable (e.g., a date relative to the time of model object creation)

您需要指定相关的模型并设置默认值。

class User(models.Model):
    def default_group(self):
        return Group.objects.get_or_create(name="Free")[0]

    group = models.ForeignKey('app_name.Group', default=default_group)

您的默认值将在模型定义时进行评估,但Django允许您提供可调用的默认值,为每个实例创建调用。

答案 1 :(得分:1)

解释错误 - 一旦函数内部的代码(如问题中的行),只要Python加载models.py文件,就会执行该代码。这种情况发生在Django进程的早期阶段,当Django在每个INSTALLED_APPS中查找一个models.py文件并导入它时。问题是您还不知道还导入了哪些其他模型。这里的错误是因为Group模型(来自django.auth.models)尚未导入,所以就好像它还不存在一样。

其他人建议你可以将Group.objects.get_or_create(name="Free")[0]放在一个函数中,这样就不会立即执行,Django只会在需要知道值时调用该函数。此时,项目中的所有模型以及Django自己的模型都将被导入并且可以正常工作。

关于问题的第二部分...是的,每当您使用getget_or_create方法时,您需要在唯一字段上进行查询,否则您可能会获得MultipleObjectsReturned例外。

事实上,我认为你不应该使用get_or_create来做你想做的事情。相反,您应该使用初始数据夹具:
https://docs.djangoproject.com/en/1.9/howto/initial-data/
...在运行站点之前确保默认组已存在(并且具有已知的主键值)。

这样您就会知道默认pk的唯一Group,并且您可以进行get查询:

def default_group():
    return Group.objects.get(pk=1)

class YourModel(models.model):
    group = models.ForeignKey(Group, default=default_group)