2016-05-07 2 views
1

Я использую наследование модели django для создания модели Entity, так что я могу ссылаться на два внешних ключа в модели диалога, как entity_1 и entity_2 может быть Лицом или Бизнесом. Тем не менее, я получаю следующее сообщение об ошибке:Поле определяет отношение с моделью «Entity», которое либо не установлено, либо является абстрактным

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) 
+0

вы не можете ссылаться на абстрактный класс. Он не создает таблицу базы данных. – trantu

+0

@trantu, что мне тогда делать? Я хотел бы, чтобы entity_1 и entity_2 ссылались на Person и Business, поэтому я могу получить доступ к каждой из модели разговора – methuselah

ответ

3

вы не можете ссылаться на абстрактный класс. Он не создает таблицу базы данных. 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') 
+0

Спасибо. Я прочитал статью, и я все еще немного неясен, как это будет соответствовать контексту моего кода? Можете ли вы привести простой пример, который соответствует тому, что я делаю? – methuselah

+0

Это то, что я сделал до сих пор: http://pastebin.com/2KbXHkQh, я продолжаю получать сообщение об ошибке. Объект 'AttributeError: 'module не имеет атрибута' GenericForeignKey'' – methuselah

+0

вам нужно позвонить' from django.contrib .contenttypes.fields import GenericForeignKey'. Я привел пример. Пожалуйста, посмотрите на это. – trantu

Смежные вопросы