Django查询彼此喜欢的用户

时间:2019-05-14 03:26:25

标签: python mysql sql django orm

我有一个看起来像这样的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)

我正在尝试使用Django的ORM编写查询,但被卡住了。给定一个用户(比如说user_1),我想返回所有其中user_1对另一个用户(比如说user_2)投票为True,而user_2对user_1投票为真票的所有行。

我认为我可能需要使用Django的Q function,但不确定。这是我所拥有的:

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

2 个答案:

答案 0 :(得分:0)

请考虑将ID为1的用户投票给ID为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))

如果您没有得到准确的输出,请提供更多信息,并在示例输出中提及您期望的输出。

答案 1 :(得分:0)

我认为应该是这样的:

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

意味着,它将返回所有投票者为用户本人或其他人对其进行投票时为他的比赛。