Запрос, который охватывает и следует за несколькими таблицами - PullRequest
0 голосов
/ 13 сентября 2018

Мой вопрос касается создания запроса, который фильтрует объекты, связанные через несколько промежуточных таблиц.Моя реляционная база данных выглядит так:

enter image description here

Любое количество продуктов может быть загружено одним пользователем (отношение один ко многим).Тем не менее, пользователи также могут оценивать продукты.Ранжирование может быть завершено несколькими пользователями, и пользователь может иметь несколько ранжирований (отношение «многие ко многим»).То же самое относится к продукту и ранжированию.Я использую явные промежуточные таблицы (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”)

1 Ответ

0 голосов
/ 13 сентября 2018

Вы немного запутались между вашими отношениями в M2M и их сквозными моделями.

Например, я не понимаю, почему ваш M2M от продукта до рейтинга называется "принадлежать".Это следует называть «рейтингом».Ваш M2M от Ранжирования до Пользователя, по крайней мере, имеет правильное базовое имя, но он указывает на многих пользователей, поэтому должны быть «пользователи».

Тем не менее, смысл в том, что когда вы следуете за M2M, вам не нужнопринять во внимание сквозные таблицы.И другая проблема заключается в том, что «пользователь» сам по себе является моделью, поэтому для сравнения с именем пользователя вам нужно будет продолжать следовать этому полю.Итак:

Product.objects.filter(belong__user__username="username")
...