Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django中使用get\u或\u create定义默认的ForeignKey对象?_Python_Django_Database - Fatal编程技术网

Python 如何在django中使用get\u或\u create定义默认的ForeignKey对象?

Python 如何在django中使用get\u或\u create定义默认的ForeignKey对象?,python,django,database,Python,Django,Database,我想把两个模型联系起来:用户和组。 每个用户都属于一个组。我已尝试通过在get\u或\u create()中使用创建默认用户: 但它引发了以下错误: (fields.E300)字段定义了与模型“组”的关系,该模型未安装或是抽象的 如何解决此问题 每个用户必须有一个非空的组值。所以我已经读过这个get\u或\u create()方法。但我也看到它可以返回多个对象。。。我不想发生这种事。我考虑过创建一个唯一的名称参数,但是有更好的解决方案吗 你能帮帮我吗?非常感谢您的帮助。您可以在这里找到更全面的答

我想把两个模型联系起来:用户和组。 每个用户都属于一个组。我已尝试通过在get\u或\u create()中使用创建默认用户:

但它引发了以下错误:

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

如何解决此问题

每个用户必须有一个非空的组值。所以我已经读过这个get\u或\u create()方法。但我也看到它可以返回多个对象。。。我不想发生这种事。我考虑过创建一个唯一的名称参数,但是有更好的解决方案吗


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

您可以在这里找到更全面的答案:

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

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允许您提供一个可调用的默认值,该默认值将在每次创建实例时调用。

为了解释错误,Python加载
models.py
文件后,将立即执行不在函数内的代码,例如问题中的行。这发生在Django进程启动的早期,Django在每个
已安装的应用程序中查找models.py文件并将其导入。问题是,您不知道已经导入了哪些其他模型。这里的错误是因为
模型(来自
django.auth.models
)尚未导入,因此就好像它还不存在一样

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

关于你问题的第二部分。。。是的,无论何时使用
get
get\u或\u create
方法,都需要查询唯一字段,否则可能会返回
multipleobjects
异常

事实上,我认为你不应该使用
get\u或\u create
来完成你在这里要做的事情。相反,您应该使用初始数据装置:

…以确保在运行站点之前,默认组已存在(并且具有已知的主键值)

这样,您将知道默认
组的唯一
pk
,您可以执行
get
查询:

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

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

为了解释错误,Python加载
models.py
文件后,就会立即执行不在函数中的代码,例如问题中的行。这发生在Django进程启动的早期,Django在每个
已安装的应用程序中查找models.py文件并将其导入。问题是,您不知道已经导入了哪些其他模型。这里的错误是因为
模型(来自
django.auth.models
)尚未导入,因此它似乎不存在(尚未)。正如其他人在回答中所示,您可以将
组.objects.get_或_create(name=“Free”)[0]
放在函数中,这样它就不会立即执行,Django将只在函数需要知道值时调用该函数。此时,您的项目中的所有模型以及Django自己的模型都将被导入,它将工作。我已经创建了它,当我通过管理屏幕创建组时,它工作了。然而,当我删除数据库并再次测试它时,它不起作用。似乎该组不是由夹具创建的。当我创建它时,它会说
从一个装置安装了一个对象
,但当我在shell上运行命令时,它会返回一个空数组
Group.objects.all()[]
。我不知道为什么。你有什么线索吗?看看数据库,看看这个装置创造了什么
def default_group():
    return Group.objects.get(pk=1)

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