【问题标题】:Model has either not been installed or is abstract模型尚未安装或抽象
【发布时间】:2014-01-29 11:02:01
【问题描述】:

当我尝试迁移我的代码时,我收到了这个错误。 这是我的代码和类:

from django.db import models
from core.models import Event

class TicketType(models.Model):
    name = models.CharField(max_length=45)
    price = models.DecimalField(max_length=2, decimal_places=2, max_digits=2)
    type = models.CharField(max_length=45)
    amount = models.IntegerField()
    event = models.ForeignKey(Event)

class Meta:
    app_label = "core"


import datetime
from django.core.serializers import json
from django.db import models
from core.models import User


class Event(models.Model):
    page_attribute = models.TextField()
    name = models.TextField(max_length=128 , default="New Event")
    description = models.TextField(default="")
    type = models.TextField(max_length=16)
    age_limit = models.IntegerField(default=0)
    end_date = models.DateTimeField(default=datetime.datetime.now())
    start_date = models.DateTimeField(default=datetime.datetime.now())
    is_active = models.BooleanField(default=False)
    user = models.ForeignKey(User)
    ticket_type=models.ForeignKey('core.models.ticket_type.TicketType')

    class Meta:
            app_label = "core"

这是我得到的错误:

CommandError:一个或多个模型未验证: core.event: 'ticket_type' 与模型 core.models.ticket_type.TicketType 有关系, 要么没有安装,要么是抽象的。

【问题讨论】:

  • 您的Event 模型显示不完整; ticket_type 字段以未终止的字符串结尾。那条线的其余部分在哪里?
  • 这些是在两个单独的文件中吗?如果有,为什么?
  • 抱歉,我添加了该行的其余部分
  • 是的,它们在单独的文件中,我试图将其分解以防止更大的 model.py
  • models.py 拆分到不同的文件中并不是一个简单的过程,而创建不同的应用程序通常是一个更好的选择。看到这个答案:stackoverflow.com/a/1160607/276451 无论如何,一个有几百行的models.py 并不算太大。

标签: python django-models foreign-keys


【解决方案1】:

将这些放在同一个应用程序中的不同文件中,会不必要地混淆自己。

但是您的问题是由您引用目标模型的方式引起的。您不使用模型的完整模块路径:您只需使用'app_name.ModelName'。所以在你的情况下应该是:

ticket_type=models.ForeignKey('core.TicketType')

【讨论】:

  • 我不喜欢 Django 的一个很好的理由。它缺乏灵活性。 Django 开发人员是否熟悉每个文件的类的概念?
  • @MihaiH 当然不是,因为这是一个不适用于 Python 的 Java 概念。这与灵活性有什么关系?
  • 我在尝试使用 models.OneToOneField('ModelName') 时收到了相同的错误消息。只要两个模型都在同一个应用程序中,它就可以工作。您的回答帮助我意识到我只需要包含应用名称即可使其正常工作。
  • @MihaiH 你知道你在说“缺乏灵活性”吗?什么是“缺乏约束”? Python 不会阻止你在不同的文件中编写模型,只是你必须知道如何去做。如果你更了解 Python,你会喜欢它而不是讨厌它。
  • @Alessandro Dentella 那是很久以前的事了,我会说差不多 5 年了。我的评论不是关于 Python,而是关于 Django。我使用 Python 已经有一段时间了,但我仍然不喜欢 Django :)
【解决方案2】:

另一个问题可能是在单独的文件中使用多个模型时缺少语句,例如:

class Meta:
    app_label = 'core_backend'

【讨论】:

    【解决方案3】:

    当我没有在我的INSTALLED_APPS 设置中添加第三方应用程序时,我遇到了这个错误。

    【讨论】:

      【解决方案4】:

      如果您的模型文件中存在阻止正确加载的错误,您也可能会收到此错误。例如,在models.py中

      from third_party_module_i_havent_installed import some_method
      

      【讨论】:

      • 或当它在您尚未安装的应用程序中定义时。
      猜你喜欢
      • 2016-06-24
      • 2013-04-20
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2021-07-12
      • 2019-06-27
      相关资源
      最近更新 更多