(Django) Как ссылаться на несколько уровней отношений? - PullRequest
0 голосов
/ 09 мая 2020

Следующее предназначено для приложения для творческого письма. Все аспекты (персонажи, сцены, проекты и т. Д. c.) Записаны в одной и той же модели, что позволяет создать простой каталог на боковой панели. У каждого есть модели расширения для добавления определенных c полей, поэтому, когда элемент выбран на боковой панели, модель расширения загружается в виде формы справа. Дополнительные поля модели расширения и модель юниверса исключены для ясности.

Проблема в том, что я действительно застрял с ограничением выбора в конкретном поле c ManytoMany.

MODELS.PY

class user_information
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    current_universe = models.PositiveSmallIntegerField(blank=True, null=True)

class element_type 
    name <e.g. ID 1 = universe, ID 2 = project, ID 3 = scene, ID 4 = draft, ID 5 = characters>

class element
    name = models.CharField(max_length=100)
    elements_type = models.ForeignKey(element_type, on_delete=models.CASCADE)
    universe = models.PositiveSmallIntegerField() <default value will be set automatically to match current_universe>
    parent_ID models.ForeignKey('self', on_delete=models.CASCADE) <if the element is a scene, this will identify its draft; likewise with a draft and its project>

class extension_project
    name = models.CharField(max_length=100)
    element_id = models.ForeignKey(element, on_delete=models.CASCADE)
    characters = models.ManyToManyField(element, limit_choices_to={'elements_type': 1, 'universe': ? User_information’s current_universe – record 1}) <don't know how to do this at the moment but that's not part of the question>


class extension_draft
    name = models.CharField(max_length=100)
    element_id = models.ForeignKey(element, on_delete=models.CASCADE)

class extension_scenes
    name = models.CharField(max_length=100)
    characters = models.ManyToManyField(element, limit_choices_to={'element_type': 1, < ? elements with the same project as this scene’s 1) element’s 2) parent ID’s 3) parent ID > })

Мне нужен список выбора символов в этой модели extension_scenes, чтобы показывать мне только символы, связанные с существующим проектом (соединение, выполненное через модель extension_project с столбец символов). Как узнать, какой проект? Путем сопоставления проекта текущей выбранной записи extension_scene со столбцом element_id модели extension_project. Какому проекту принадлежит extension_scene, можно найти в элементной модели.

Итак, приложение должно - сначала идентифицировать проект этой записи extension_scene:

  • найдите в модели элементов ID , который соответствует elements_ID ;
  • для этого найденного элемента найдите элемент, чей ID совпадает с его parent_ID (таким образом, перейдя к элементу, который имеет черновой тип в качестве типа)
  • для этого (чернового) элемента, найдите элемент чей ID соответствует его parent_ID (таким образом, перейдя к записи элемента проекта этого чернового элемента)
  • обратите внимание на этот элемент (проект) ID - назовем это X . .

Затем ограничьте этот список символов:

  • только элементы списка (с типом 1, т.е. символы);
  • поиск в записи extension_projects , и найдите elements_ID = до X

Спасибо за любую помощь

1 Ответ

0 голосов
/ 09 мая 2020

Таким образом, приложение должно - сначала идентифицировать проект этой записи extension_scene:

  • искать в модели elements идентификатор, который соответствует elements_ID этой записи;
  • для этого найденный элемент, найдите элемент, идентификатор которого совпадает с его parent_ID (таким образом, перейдя к элементу, имеющему черновик в качестве его типа)
  • для этого (чернового) элемента, найдите элемент, чей идентификатор совпадает с его parent_ID (таким образом, перейдя к этому запись элемента проекта чернового элемента)
  • обратите внимание на идентификатор этого элемента (проекта) - назовем его X.

Что касается приведенной выше части, extension_scenes.objects.all().values('elements_id__parent_ID__parent_ID') Насколько я понял, это может быть решением.

Но я не мог понять требования более поздней части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...