用另一个对象过滤Django对象

时间:2019-02-21 14:28:41

标签: python django

Django 1.11。我有一个模型Article和另一个模型ReadArticles

class Article(models.Model):
  name = models.CharField()
  length = models.IntegerField()

class ReadArticle(models.Model):
  user = models.ForeignKey(User)
  article = models.ForeignKey(Article)

我想获取所有尚未阅读的文章的列表。我已经在使用Q

length_filter = Q(length__lt=5000)
unread_articles = Article.objects.filter(length_filter).all()

如何扩展此范围以排除ID /用户组合在read_articles表中的所有文章?

3 个答案:

答案 0 :(得分:2)

由于您尚未声明客户related的姓名,因此只需.exclude

Article.objects.filter(length__lt=5000).exclude(readarticle__user=request.user)

答案 1 :(得分:1)

尝试以下查询,将用户对象替换为<USER TO FILTER FOR>

Article.objects.exclude(id__in=[ra.article.id for ra in ReadArticle.objects.filter(user=<USER TO FILTER FOR>)])

答案 2 :(得分:0)

您可以排除Article引用了当前用户的ReadArticle个对象。

Article.objects.filter(
    length__lt=5000,
).exclude(
    readarticle__user=current_user,
)