【问题标题】:Field defines a relation with model 'Entity', which is either not installed, or is abstract字段定义了与模型“实体”的关系,该模型要么未安装,要么是抽象的
【发布时间】:2016-05-07 08:55:05
【问题描述】:

我正在使用 django 模型继承来创建一个实体模型,这样我就可以在对话模型中引用两个外键,因为 entity_1 和 entity_2 可以是个人或企业。但是我不断收到以下错误消息:

api.Conversation.entity_1: (fields.E300) Field defines a relation with model 'Entity', which is either not installed, or is abstract.
api.Conversation.entity_2: (fields.E300) Field defines a relation with model 'Entity', which is either not installed, or is abstract.

这是我目前的代码:

class Entity(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid4, editable=False)

    class Meta:
         abstract = True

 class Person(Entity):
    """
    Person model
    """

    avatar = models.ImageField(upload_to=get_upload_avatar_path, blank=True, null=True, default=None, max_length=255)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)


class Business(Entity):
    """
    Business model
`   """
    name = models.CharField(max_length=255, null=True, default=None)


class Conversation(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
    entity_1 = models.ForeignKey(Entity)
    entity_2 = models.ForeignKey(Entity)

【问题讨论】:

  • 你不能引用抽象类。它不会创建数据库表。
  • @trantu 那我该怎么办?我想 entity_1 和 entity_2 都引用 Person 和 Business,所以我可以从对话模型中访问每个

标签: python django entity-framework


【解决方案1】:

你不能引用抽象类。它不创建数据库表。 https://docs.djangoproject.com/en/1.9/topics/db/models/#abstract-base-classes

您可以使用 GenericForeignKey https://docs.djangoproject.com/en/1.9/ref/contrib/contenttypes/#generic-relations

一个例子:

from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
class Conversation(models.Model):
    entity_one = models.ForeignKey(ContentType,on_delete=models.CASCADE,related_name='entity_one')
    entity_two = models.ForeignKey(ContentType,on_delete=models.CASCADE,related_name='entity_two')
    entity1_id = models.PositiveIntegerField()
    entity2_id = models.PositiveIntegerField()
    entity_1_object = GenericForeignKey('entity_one', 'entity1_id')
    entity_2_object = GenericForeignKey('entity_two', 'entity2_id')

【讨论】:

  • 谢谢。我已经通读了这篇文章,但我仍然不清楚这将如何适应我的代码上下文?您能否提供一个适合我正在做的易于遵循的示例?
  • 这是我到目前为止所做的:pastebin.com/2KbXHkQh,我不断收到错误消息AttributeError: 'module' object has no attribute 'GenericForeignKey'
  • 您必须致电from django.contrib.contenttypes.fields import GenericForeignKey。我发布了一个例子。请看那个。
  • @trantu:您还需要添加entity_1_identity_2_id 并在GenericForeignKey 中使用它们。您不能同时使用object_id(甚至没有声明)。
  • 仍然不行,你需要将entity_1_identity_2_id定义为PositiveIntegerField。
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 2022-01-25
  • 1970-01-01
  • 2013-04-20
  • 2020-08-03
  • 1970-01-01
  • 2021-08-17
  • 2018-03-15
相关资源
最近更新 更多