Запрос Django моделирует два уровня отношения внешних ключей - PullRequest
1 голос
/ 16 марта 2020

Я создаю приложение словаря, используя Django. Основными моделями в этом приложении являются Expression с, Definition с и City с. Логика c заключается в том, что каждый Expression имеет один или несколько Definition с, а каждый Definition связан с одним City.

Вот моя проблема : Я хочу запросить все City, связанные с Expression, с уровня Expression.

Например, я хотел бы сделать an_expression.cities и получить все City связанные с (каждый Definition из) an_expression.

Вот мои модели :

class City(models.Model):
    city = models.CharField()

class Expression(models.Model):
    expression = models.CharField()
    cities = models.ManyToManyField(City, related_name="expressions")

class Definition(models.Model):
    city = models.ForeignKey(City, related_name="definitions")
    expression = models.ForeignKey(Expression, related_name="definitions")

Этот код теперь работает. Однако каждый раз, когда я добавляю Definition, мне нужно добавить City к обоим Expression --AND-- * Definition.

Вот мой вопрос : есть ли способ только добавить City к Definition, а затем каким-то образом иметь возможность запросить an_expression.cities и получить все города (в основном избавиться от поля cities в модели Expression?

1 Ответ

1 голос
/ 16 марта 2020

Не используйте идентичные related_name для различных внешних ключей в Definition классе

class Definition(models.Model):
    city = models.ForeignKey(City, related_name="definitions_city")
    expression = models.ForeignKey(Expression, related_name="definitions_expression")

. Вы можете получить список city для Expression, как это

an_expression = Expression.objects.first()
an_expression.definitions_expression.values('city__city')

Так что нет необходимости в cities ManyToManyField в Expression классе

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