Автор Тема: Обратные связи django  (Прочитано 1456 раз)

DigitalMag

  • Юный джедай
  • **
  • Сообщений: 89
  • Репутация +6/-0
    • Просмотр профиля
Обратные связи django
« : Апреля 07, 2019, 04:19:43 pm »
У меня есть модель Friends, которая является ManyToMany для User:

    class Friends(models.Model, MixinModel):
        by = models.ForeignKey(User, related_name="from_friend")
        friend = models.ForeignKey(User, related_name="to_friend")
        approve = models.CharField(max_length=2, choices=RELATION_STATUS, default=State.No)

Внутри ListView я переопределяю get_queryset для того, чтобы отфильтровать по тем User, которым была отправлена заявка в друзья от текущего пользователя. Запрос recipients = qs.filter(to_friend__approve=State.No) верно возвращает всех пользователей, заявки которым были отправлены. Пытаюсь делать по аналогии для текущего пользователя:

recipients = qs.filter(from_friend__by = me)Но получаю нулевой результат, почему?

AdminUser

  • Team Lead
  • Юный джедай
  • *****
  • Сообщений: 65
  • Репутация +8/-0
    • Просмотр профиля
Re: Обратные связи django
« Ответ #1 : Апреля 07, 2019, 04:20:31 pm »
А какой запрос в итоге получается?

DigitalMag

  • Юный джедай
  • **
  • Сообщений: 89
  • Репутация +6/-0
    • Просмотр профиля
Re: Обратные связи django
« Ответ #2 : Апреля 07, 2019, 04:21:50 pm »
Такой:

SELECT ••• FROM "main_profile" INNER JOIN "main_friends"
ON ("main_profile"."id" = "main_friends"."by_id")
WHERE "main_friends"."by_id" = '20' ORDER BY "main_profile"."id" ASC

Пробовал еще так:

recipients = qs.filter(from_friend__friend = me)
В итоге получаю:

SELECT ••• FROM "main_profile" INNER JOIN "main_friends"
ON ("main_profile"."id" = "main_friends"."by_id")
WHERE "main_friends"."friend_id" = '20' ORDER BY "main_profile"."id" ASC

В итоге получаю взаимных друзей - опять не то
« Последнее редактирование: Апреля 07, 2019, 04:26:39 pm от AdminUser »

AdminUser

  • Team Lead
  • Юный джедай
  • *****
  • Сообщений: 65
  • Репутация +8/-0
    • Просмотр профиля
Re: Обратные связи django
« Ответ #3 : Апреля 07, 2019, 04:37:52 pm »
Попробуйте наоборот:

recipients = qs.filter(to_friend__by = me)
Составление грамотных sql-запросов - огромное искусство

DigitalMag

  • Юный джедай
  • **
  • Сообщений: 89
  • Репутация +6/-0
    • Просмотр профиля
Re: Обратные связи django
« Ответ #4 : Апреля 07, 2019, 04:45:37 pm »
Это уже лучше! Спасибо