gpt4 book ai didi

python - 用Django进行复杂查询(来自各位小伙伴的帖子)

转载 作者:太空狗 更新时间:2023-10-29 22:27:19 24 4
gpt4 key购买 nike

我是 Python 和 Django 的新手,所以请耐心等待。

我有以下模型:

class User(models.Model):
name = models.CharField(max_length = 50)
...

class Post(models.Model):
userBy = models.ForeignKey(User, related_name='post_user')
userWall = models.ForeignKey(User, related_name='receive_user')
timestamp = models.DateTimeField()
post = models.TextField()

class Friend(models.Model):
user1 = models.ForeignKey(User, related_name='request_user')
user2 = models.ForeignKey(User, related_name='accept_user')
isApproved = models.BooleanField()
class Meta:
unique_together = (('user1', 'user2'), )

我知道这可能不是用 Django 处理它的最好/最简单的方法,但我是这样学的,我想保持这样。

现在,我想做的就是获取一个人及其 friend 的所有帖子。现在的问题是如何使用 Django 过滤器来做到这一点?

我认为在 SQL 中它看起来像这样:

SELECT p.* FORM Post p, Friend f 
WHERE p.userBy=THEUSER OR (
(f.user1=THEUSER AND f.user2=p.userBy) OR
(f.user2=THEUSER AND f.user1=p.userBy)
)

不保证正确性,只是为了说明我正在寻找的结果。

最佳答案

from django.db.models import Q

Post.objects.filter( \
Q(userBy=some_user) | \
Q(userBy__accept_user__user1=some_user) | \
Q(userBy__request_user__user2=some_user)).distinct()

更新

对不起,那是我的错。我没有注意你的 related_name 值。请参阅上面更新的代码。单独使用 userBy__accept_useruserBy__request_user 是行不通的,因为它是对 Friend 的引用,你无法将其与 进行比较用户。我们在这里所做的是跟踪与 Friend 的反向关系,然后一旦我们到达那里,查看好友请求中的 other 用户是否是相关用户。

这也说明了恰当描述反向关系的重要性。许多人犯了你在这里犯的同样的错误,并在他们创建 FK 的模型之后命名 related_name (User),实际上,当我们谈论反转 FK,我们现在谈论 Friend。简单地说,您的相关名称会更有意义,例如:friend_requestsaccepted_friends

关于python - 用Django进行复杂查询(来自各位小伙伴的帖子),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12866920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com