(fields.E300)字段定义与未安装或抽象的模型的关系

时间:2015-02-20 10:23:32

标签: django python-2.7 django-models

我的Django项目中安装了2个应用程序“aplikacja”

第一个名为:“Godzina”

from django.db import models

class Godzina (models.Model):
        GODZINA = (
        ('19', '19'),
        ('20', '20'),
        ('21', '21'),
        )
        godzina = models.CharField(max_length=6, choices=GODZINA, verbose_name='jezyk')

,第二个命名为:“UserProfile”

from django.db import models
from django.contrib.auth.models import User
from godzina.models import Godzina

class UserProfile(models.Model):
    czas = models.ForeignKey('Godzina')   
    user = models.OneToOneField(User)

我收到了这样的错误:

userprofile.UserProfile.czas: (fields.E300) Field defines a relation with model 'Godzina', which is either not installed, or is abstract.

这是什么意思?我希望用户只能选择管理员放入应用程序“Godzina”的时间。例如我定义时间为晚上19点,晚上20点,然后用户可以在UserProfile应用程序中选择这些值

有可能解决这个问题吗?

8 个答案:

答案 0 :(得分:26)

您应该将应用名称添加到FK定义中的相关型号名称:

czas = models.ForeignKey('firstapp.Godzina') 

答案 1 :(得分:2)

从一个应用程序到另一个应用程序使用模型时的一般信息是

model_variable = models.ForeignKey('the_appname.the_model_class_name')

在这种情况下,对于Django项目“ aplikacja”,对于第二个应用程序(UserProfile),它应为:

czas = models.ForeignKey(‘Godzina.Godzina') 

在此之后,我建议您删除迁移文件夹(在您创建的应用程序下:Godzina和UserProfile下)中的所有文件(初始化文件除外)。还要删除SQLite文件。然后跑 Python manage.py makemigrations 和 python manage.py迁移。 这些步骤很可能可以解决问题。

答案 2 :(得分:1)

from django.db import models
from django.contrib.auth.models import User

from godzina.models import Godzina

class UserProfile(models.Model):

    czas = models.ForeignKey('Godzina')   

    user = models.OneToOneField(User)

    class Meta:     #you have to add abstract class
        abstract = True

答案 3 :(得分:1)

如果您是通过搜索到达这里的,可能会有助于提醒您检查自己是否记得让班级成为模型(以防万一,像我一样,您在几分钟之内一直在盲目寻找更复杂的原因! )

如果您不是从models.Model继承,则会得到OP描述的错误:

class Godzina:
   ...

确保您拥有:

class Godzina(models.Model):
   ...

答案 4 :(得分:1)

我遇到了同样的错误,这是由于类的名称相似而导致的问题。

答案 5 :(得分:0)

为可能遇到类似问题的用户提供更清晰的说明。 例如,应用名称和型号名称相同可能会造成混淆 该应用程序的名称为“学生”,并且在学生/模型中,您有一个名为 学生,继承模型。

占位符的实现:

model_variable = models.ForeignKey('the_appname.the_model_class_name)

更精确的示例:      一个应用程序名称为学生,模型名称也为Student,另一个应用程序出勤,属性为“ student_id”

student_id = models.ForeignKey('student.student)

答案 6 :(得分:0)

遇到相同的问题

django-simple-history == 2.10.0, django = 2.2.13

要修复它,我需要指出模型,而不是使用名称str'Godzina'

class UserProfile(models.Model):
    czas = models.ForeignKey(Godzina, on_delete=xxxxx)   

答案 7 :(得分:0)

与OP场景无关,但一个可能导致上述错误的潜在错误是在Meta中指定了错误的app_label

class ABC(models.Model):
    foo = models.TextField()

    class Meta:
        app_label = 'appp'

class XYZ(models.Model):
    abc = models.ForeignKey('ABC', on_delete=models.CASCADE)

    class Meta:
        app_label = 'app'

错误:

django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
app.XYZ.abc: (fields.E300) Field defines a relation with model 'ABC', which is either not installed, or is abstract.
app.XYZ.abc: (fields.E307) The field app.XYZ.abc was declared with a lazy reference to 'app.abc', but app 'app' doesn't provide model 'abc'.