【问题标题】:(fields.E300) Field defines a relation with model which is either not installed, or is abstract(fields.E300) 字段定义与模型的关系,该模型要么未安装,要么是抽象的
【发布时间】:2015-04-21 23:51:53
【问题描述】:

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

第一个名为:“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 pm、20 pm 的时间,然后用户可以在 UserProfile 应用程序中选择这些值

这个问题可以解决吗?

【问题讨论】:

    标签: django python-2.7 django-models


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      与 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'.
      

      【讨论】:

        【解决方案3】:

        中遇到同样的问题

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

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

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

        【讨论】:

          【解决方案4】:

          如果您是通过搜索来到这里的,它可能会提醒您检查您是否记得将您的班级设为模型(以防万一,您像我一样,在几分钟内盲目地寻找更复杂的原因! )

          如果您没有从 models.Model 继承,您将收到 OP 描述的错误:

          class Godzina:
             ...
          

          确保你有:

          class Godzina(models.Model):
             ...
          

          【讨论】:

            【解决方案5】:

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

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

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

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

            在此之后,我建议您删除迁移文件夹中的所有文件(在您创建的应用程序下:Godzina 和 UserProfile),但 init 文件除外。同时删除 SQLite 文件。然后运行 Python manage.py makemigrations 和 python manage.py 迁移。 这些步骤很可能会解决问题。

            【讨论】:

              【解决方案6】:

              为可能遇到类似问题的用户提供更清晰的信息。 如果应用名称和模型名称相同,可能会造成混淆,例如 应用名称是“学生”,在学生/模型中,您有一个名为 Student,继承models.Model

              占位符实现:

              model_variable = models.ForeignKey('the_appname.the_model_class_name)
              

              更精确的例子: 应用名称为学生,模型名称为学生,另一个应用出勤率,属性为“student_id”

              student_id = models.ForeignKey('student.student)
              

              【讨论】:

                【解决方案7】:
                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
                

                【讨论】:

                • 不鼓励仅使用代码回答,因为它们没有为未来的读者提供太多信息,请对您所写的内容提供一些解释
                • 为了更好地解释这个答案,如果您在关系指向的模型中的 Meta 类中声明了 abstract = True,则会收到错误消息。当我从 ArrayField 切换到 ManyToManyField 并忘记从模型中删除 abstract 时,它发生在我身上。
                • 解决方法是从ForeignKey指向的模型中的Meta中删除abstract = True
                【解决方案8】:

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

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

                【讨论】:

                • 我的设置具有相同的系统,但此修复对我不起作用。
                • 这是有效的,因为您可能使用的外键没有添加“firstapp”。模型可能在同一个 models.py 文件中。当您使用外部模型(来自不同应用的模型)时,您需要指定包含该模型的应用。
                猜你喜欢
                • 2022-01-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-04-20
                • 2020-08-03
                • 1970-01-01
                • 1970-01-01
                • 2021-08-17
                相关资源
                最近更新 更多