Джанго опрашивают пользователей, которые любят друг друга - PullRequest
0 голосов
/ 14 мая 2019

У меня есть модель Django, которая выглядит следующим образом:

class Matches(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    voter = models.ForeignKey(User, related_name='given_vote', on_delete=models.CASCADE)
    vote = models.BooleanField(default=False)

Я пытаюсь написать запрос, используя ORM django, но я застрял.Учитывая пользователя (скажем, user_1), я хочу вернуть все строки, где user_1 проголосовал True за другого пользователя (скажем, user_2) И user_2 проголосовал True за user_1.

Я думаю, что мне может понадобитьсяиспользуйте функцию Джанго Q , но не уверен.Вот что у меня есть:

class User:
    def calculate_matches(self):    
        return Matches.objects.filter(Q(voter=self, vote=True) & Q(user=self, vote=True))

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Я думаю, что это должно быть примерно так:

class User:
    def calculate_matches(self):    
        return Matches.objects.filter(Q(voter=self) | Q(user=self),  vote=True)

Значит, он вернет все совпадения, в которых избиратель сам является пользователем, или он является пользователем, когда кто-то еще проголосовал за него.

0 голосов
/ 14 мая 2019

Рассмотрим пользователя с идентификатором 1 проголосовавшего за пользователя с идентификатором 2 проголосовавшего и наоборот.Тогда релевантный sql будет

SELECT "users_matches"."id", "users_matches"."user_id", "users_matches"."voter_id", "users_matches"."vote" FROM "users_matches" WHERE ("users_matches"."vote" = True AND "users_matches"."voter_id" = 1 AND "users_matches"."user_id" = 2 AND "users_matches"."vote" = True)

И Django ORM, который вы пробовали, выглядит нормально.

Matches.objects.filter(Q(voter=1, vote=True) & Q(user=2, vote=True))

Пожалуйста, включите больше информации, если вы не получили точный вывод, укажите, какой вывод вы ожидаете с примеромвыход.

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