Мой вопрос касается создания запроса, который фильтрует объекты, связанные через несколько промежуточных таблиц.Моя реляционная база данных выглядит так:
Любое количество продуктов может быть загружено одним пользователем (отношение один ко многим).Тем не менее, пользователи также могут оценивать продукты.Ранжирование может быть завершено несколькими пользователями, и пользователь может иметь несколько ранжирований (отношение «многие ко многим»).То же самое относится к продукту и ранжированию.Я использую явные промежуточные таблицы (Rank и Belong), которые определяют отношения M2M с помощью параметра through, потому что у них есть дополнительная информация, которая описывает отношения.
Код модели выглядит примерно так (для простоты я опустил нерелевантные поля)):
class Product(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
belong= models.ManyToManyField(Ranking, through="Belong")
#...
#The M2M table which relates Product and Ranking
class Belong(models.Model):
ranking = models.ForeignKey(Ranking, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
#...
class Meta:
unique_together = (("ranking", "product"))
class Ranking(models.Model):
user= models.ManyToManyField(settings.AUTH_USER_MODEL, through="Rank")
created = models.DateTimeField(auto_now_add=True)
#...
#The M2M table which relates User and Ranking
class Rank(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
ranking = models.ForeignKey(Ranking, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
#...
class Meta:
unique_together = (("user", "ranking"))
#The AUTH_USER_MODEL, which is not included here
Мой вопрос: как мне создать запрос, который фильтрует товары, которые были ранжированы данным пользователем?Это подразумевает «отслеживание» отношений между таблицами Belong, Ranking и Rank.Я попробовал это, следуя инструкции Django , но это не сработало:
Product.objects.filter(belong__ranking__rank__user=”username”)