我想要关联两个模型:用户和组。 每个用户都属于一个组。我试图在get_or_create()中使用
创建默认用户#include<bvector.h>
#include<iostream>
.....
但它引发了以下错误:
(fields.E300)字段定义与模型“组”的关系,该组未安装或是抽象的。
我该怎么做才能解决这个问题?
每个用户必须具有非空组值。所以我读过这个get_or_create()方法。但我也看到它可以返回多个对象......而且我不希望它发生。我考虑过创建一个唯一的名称参数,但它有更好的解决方案吗?
你能帮助我吗?感谢您的帮助。答案 0 :(得分:2)
您需要指定相关的模型并设置默认值。
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自己的模型都将被导入并且可以正常工作。
关于问题的第二部分...是的,每当您使用get
或get_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)