我是 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 处理它的最好/最简单的方法,但我是这样学习的,并且我想保持这样。
现在,我想做的就是获取一个人及其朋友的所有帖子。现在的问题是如何使用 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()
UPDATE
抱歉,那是我的错。我没注意你的related_name
价值观。请参阅上面更新的代码。使用userBy__accept_user
or userBy__request_user
单独是行不通的,因为这将是对Friend
你无法与之相比User
。我们在这里所做的是遵循相反的关系Friend
然后一旦我们到达那里,看看是否other好友请求中的用户就是相关用户。
这也说明了适当描述反向关系的重要性。很多人都犯了和你一样的错误,并命名为related_name
在模型之后,他们创建 FK 到(User
),实际上,当我们谈论逆转 FK 时,我们现在谈论的是Friend
。简而言之,您的相关名称会更有意义,例如:friend_requests
and accepted_friends
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)