Мои модели используют GenericForeignKey
и GenericRelations
. Для упрощения моя структура моделей выглядит следующим образом:
class BaseModel(models.Model):
name = models.CharField(max_length=100)
model_labels = models.GenericRelation('ModelLabel', related_query_name='%(class)s')
model_types = models.GenericRelation('ModelType'), related_query_name='%(class)s')
class Meta:
abstract = True
class ModelA(BaseModel):
fieldA = models.CharField(max_length = 50)
class ModelB(BaseModel):
fieldB = models.CharField(max_length = 50)
class ModelLabel(models.Model);
label = models.CharField(max_length = 50)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
model_object = GenericForeignKey('content_type', 'object_id')
class ModelType(models.Model):
type = models.CharField(max_length = 50)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
model_object = GenericForeignKey('content_type', 'object_id')
class Unrelated(models.Model):
name = models.CharField(max_lenght = 50)
Проблема, с которой я сталкиваюсь, заключается в представлении администратора для ModelLabel
и ModelType
. Прямо сейчас из коробки я получаю 3 поля: Label
или Type
, Content type
и Object id
. Да, это правильно в зависимости от модели.
Но в Content type
я получаю не только ModelA
и ModelB
в качестве опции. Я также получаю Unrelated
и большинство отдельных полей разных моделей. В соответствии с документацией :
Экземпляры ContentType представляют и хранят информацию о моделях, установленных в вашем проекте, а новые экземпляры ContentType автоматически создаются при установке новых моделей.
В соответствии с этим Unrelated
может появляться в значениях, а поля моделей не должны. Так почему они появляются?
Однако это не главная проблема, с которой я борюсь. Я бы хотел сузить список вариантов на Content type
до ModelA
и ModelB
. Из того, что я собрал, так как это ForeignKey
под капотом, я должен быть в состоянии go с ModelChoiceField , но мне нужно было бы заставить его использовать некоторые жестко закодированные QuerySet
, но я не могу найти, как сделать это например из словаря. То же самое относится и к Object id
, где я хотел бы иметь возможность выбирать, какое значение я хочу использовать, основываясь на доступных числах.
До сих пор я понял, что, скорее всего, мне нужно расширить представление admin.ModelAdmin
и Скорее всего, также создать пользовательскую форму (расширение forms.ModelForm
). Это также теория, потому что до сих пор я не мог придумать, как получить упомянутый пользовательский QuerySet
или Object id
. Также у этого подхода есть некоторый недостаток, потому что если я выберу go с этим, мне понадобится настраиваемая форма для каждой модели (ModelLabel
, ModelType
) - действительно ли это необходимо?
Я знаю способ добавления класса GenericInlineModelAdmin, но это представление позволяет добавлять объект типа ModelLabel
вместе с ModelB
. Это не относится к случаю, когда объект типа ModelB
уже существует.
Подводя итог, какие основные цели я хочу достичь:
- Исправление представления администратора для создания
ModelLabel
и ModelType
- Узкий список опций для
Content type
поля до ModelA
и ModelB
- Разрешить пользователю выбирать только существующие идентификаторы для
Object id
поля