您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用Django进行复杂查询(来自所有朋友的帖子)

5b51 2022/1/14 8:22:12 python 字数 2846 阅读 516 来源 www.jb51.cc/python

我是 Python和Django的新手,所以请耐心等待我. 我有以下型号: class User(models.Model): name = models.CharField(max_length = 50) ... class Post(models.Model): userBy = models.ForeignKey(User, related_name='post_use

概述

我有以下型号:

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或userBy__request_user将不起作用,因为这将是对Friend的引用,您无法与User进行比较.我们在这里做的是遵循与朋友的反向关系,然后一旦我们在那里,看看朋友请求中的其他用户是否是有问题的用户.

这也说明了适当描述反向关系的重要性.许多人犯了你在这里犯的同样的错误并在他们创建FK到(用户)的模型之后命名related_name,实际上,当我们谈论逆转FK时,我们现在谈论的是朋友.简单地说,您的相关名称会更有意义,例如:friend_requests和accepted_friends.

总结

以上是编程之家为你收集整理的使用Django进行复杂查询(来自所有朋友的帖子)全部内容,希望文章能够帮你解决使用Django进行复杂查询(来自所有朋友的帖子)所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶