Django 在这种情况下如何制作Q对象表达式(按ForeignKey字段过滤)?
models.py:Django 在这种情况下如何制作Q对象表达式(按ForeignKey字段过滤)?,django,django-orm,Django,Django Orm,models.py: class Post(models.Model): title = models.TextField(max_length=1000, null=True, blank=True, default=None) created = models.DateTimeField(auto_now_add=True) class PostFollow(models.Model): post = models.ForeignKey(Post, on_dele
class Post(models.Model):
title = models.TextField(max_length=1000, null=True, blank=True, default=None)
created = models.DateTimeField(auto_now_add=True)
class PostFollow(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True, blank=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
从这些模型类中,我想得到一些用户没有遵循的帖子
像这样:
user = User.objects.get(pk=1)
not_followed_post = Post.objects.filter(Q(pk__lte=1000) & ~Q(self__is_not_followed_by_user=user))
我怎样才能做到这一点?我认为使用
.exclude(…)
更能自我解释:
pk\uu lte
相当怪异。通常,pk
仅用作标识符。当然,像\uu lte
这样的查询是可能的,但并不常见
是的,pk
s通常是按创建顺序“分布”的(假设您没有指定显式的),因此如果您从未指定显式的,您可能会使用它来获取比给定记录更近的记录。但我仍然认为以这种方式开始过滤有点“风险”。例如,如果以后将历史数据添加到数据库中,则这些数据(取决于插入数据的方式)可能具有更高的id
s,从而显示在结果中
not_followed_post = Post.objects.exclude(
postfollow__user=user
).filter(
pk__lte=1000
)
class PostFollow(models.Model):
post = models.ForeignKey(
Post,
on_delete=models.CASCADE,
null=True,
blank=True,
related_name='postfollow'
)
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
null=True,
blank=True,
related_name='postfollow'
)