У меня такая модель:
class A(models.Model):
....
....
class Meta:
abstract = True
class B(A):
blah..
blah..
class C(A):
blah..
blah..
Просто я хочу использовать модель A в качестве ForeignKey в другой модели.
как это:-
class X(models.Model):
"""
I want to use like this, But i'm getting error
"""
name = models.ForeignKey(A)
Но я получаю ошибку:
apis.X.name: (fields.E300) Field defines a relation with model 'A', which is either not installed, or is abstract.
Я делаю что-то неправильно? Как этого избежать?
заранее спасибо






Установка Abstract=True в вашем Meta означает, что в вашей базе данных не создается таблица.
Из документы:
Abstract base classes are useful when you want to put some common information into a number of other models. You write your base class and put abstract=True in the Meta class. This model will then not be used to create any database table. Instead, when it is used as a base class for other models, its fields will be added to those of the child class.
Чтобы решить вашу проблему, вам следует использовать внешний ключ либо для модели B, либо для модели C, поскольку они будут представлять фактические таблицы в вашей базе данных. Ваша абстрактная модель должна использоваться только для целей наследования.
@JustChill Ну, это скорее вопрос дизайна базы данных. В зависимости от фактического содержания, с которым вы работаете, могут быть более чистые способы.
Я нашел решение, спасибо за ответ,
Django предоставляет специальный тип поля (GenericForeignKey), который помогает обойти это и позволяет устанавливать отношения с любой моделью, будь то абстрактная.
Обратитесь к GenericForeignKey Docs для получения дополнительной информации об этом.
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
class TaggedItem(models.Model):
tag = models.SlugField()
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
def __str__(self):
return self.tag
ИЛИ ЖЕ:
Вы можете реализовать пользовательскую модель в базовой модели, используя в ней abstract = True, а в своих дочерних моделях вы можете использовать ее как Иностранный ключ.
Реализация будет примерно такой:
class X(models.Model):
"""
I want to use like this, But i'm getting error
"""
name = models.ForeignKey(A)
class Meta:
abstract = True
return A
Для этого нужно перейти к abstract-base-classes Документы:
Я нашел решение, спасибо за ответ
Я нашел решение:
name = models.ForeignKey(A, null=True, blank=True, on_delete=models.SET_NULL, related_name = "content_%(class)s")
Вы использовали Abstract= True в своем классе моделей?
Да в моей базовой модели, а не в модели X
@MrSingh, не могли бы вы проверить мой вопрос?
Отлично, просто я хочу попытаться избежать: name1 = models.ForeignKey (B), name2 = models.ForeignKey (C), как я могу этого избежать?