如何过滤"而不是"在Django查询Q?

时间:2018-02-19 15:52:06

标签: python sql django

我正在研究Django项目,基本上它是一种自定义文章系统。所以我们有文章分为Circle和Region。例如,我有Region1,Region2和Region3区域。同样,我有Circle1,Circle2和Circle3圆圈。我有属于一个区域和一个圆圈的用户。所以我要说我的用户,User1属于Region1和Circle2。

我为Region1和Circle1发布了Article1,为Region1和Circle2发布了Article2,Article3发布了Region2和Circle2。

我需要按以下方式为此用户过滤文章。

Get me article(s) that belongs to my circle and not to my region, get me article(s) that belongs my circle and region both.

到目前为止,我所做的是,

Article.object.filter(is_archived=False).filter(
                    Q(belongs_to_circle=self.cid) & Q(belongs_to_region=self.rid) |
                    Q(belongs_to_circle=self.cid) & ~Q(belongs_to_region=self.rid)
                )

如果我使用查询来获取属于圆圈和区域的文章,它可以正常工作,但我正在尝试获取属于我的圈子但不属于我所在地区的文章。

因此,如果发布了Region1和Circle2的文章,我应该得到它。如果为Region2和Circle2发布了文章,我应该得到它,但是如果为Region1和Circle1发布了一篇文章我不应该得到它。任何人都可以帮我正确地获得此查询吗?

self.cidself.rid也是模型对象,因为我有Region和Circle模型,而且是Article的外键。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用.exclude()

Article.object.filter(is_archived=False,belongs_to_circle=self.cid).exclude(belongs_to_region=self.rid)