ces*_*r09 6 python django django-models
我是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'), )
Run Code Online (Sandbox Code Playgroud)
我知道这可能不是用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)
)
Run Code Online (Sandbox Code Playgroud)
不保证正确性,只是想知道我正在寻找的结果.
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()
Run Code Online (Sandbox Code Playgroud)
UPDATE
对不起,那是我的错.我没注意你的related_name
价值观.请参阅上面的更新代码 使用userBy__accept_user
或userBy__request_user
单独使用将不起作用,因为这将是Friend
您无法与之比较的参考User
.我们在这里做的是遵循相反的关系Friend
,然后一旦我们在那里,看看朋友请求上的其他用户是否是有问题的用户.
这也说明了适当描述反向关系的重要性.很多人犯了你在这里犯的同样的错误,并且related_name
在模型之后命名他们正在创建FK to(User
),实际上,当我们谈论扭转FK时,我们现在正在讨论Friend
.简单地说,您的相关名称会更有意义,例如:friend_requests
和accepted_friends
.
归档时间: |
|
查看次数: |
481 次 |
最近记录: |