Настройка значений Django GenericRelation content_type в представлении добавления / изменения администратора - PullRequest
2 голосов
/ 18 апреля 2020

Мои модели используют 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 уже существует.

Подводя итог, какие основные цели я хочу достичь:

  1. Исправление представления администратора для создания ModelLabel и ModelType
  2. Узкий список опций для Content type поля до ModelA и ModelB
  3. Разрешить пользователю выбирать только существующие идентификаторы для Object id поля
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...