Django - 如何在过滤器方法中查询列表
Django - How to query a list inside of a filter method
我是 Django 的新手,我想查询对象内部的列表。我有一个 Batch
es 列表,每个批次都有一个 BatchComment
列表。他们俩都有一个User
属性。我想要做的是获取用户发表评论的批次,并且只获取用户未发表最后评论的批次。我怎样才能做到这一点?
目前我正在检索用户通过 Batch.objects.filter(comments__user=self.request.user)
发表评论的批次
我想要 Batch.objects.filter(comments__user=self.request.user).filter(comments_last__user!=self.request.user)
这是我的模型:
class Batch(TimeStampMixin):
note = models.TextField(max_length=1000)
image_url = models.URLField()
class Meta:
db_table = 'batches'
ordering = ['-created_at']
class BatchLogComment(TimeStampMixin):
body = models.TextField(max_length=500)
batch = models.ForeignKey(Batch, on_delete=models.CASCADE, related_name='comments')
user = models.ForeignKey(
User, on_delete=models.SET_NULL, blank=True, null=True, related_name='comments')
class Meta:
db_table = 'batch_log_comments'
ordering = ['-created_at']
我们可以使用子查询获取最后一个用户,然后进行相应的过滤:
from django.db.models import OuterRef, Subquery, Q
Batch.objects.annotate(
last_user=<b>Subquery(</b>
BatchLogComment.objects.filter(
<b>batch=OuterRef('pk')</b>
).order_by('-created_at').values('user')[:1]
<b>)</b>
).filter(
~Q(last_user=self.request.user),
comments__user=self.request.user
)
context=None
batch = Batch.objects.filter(comments__user_id=request.user.id).distinct()
batchlogcomment = BatchLogComment.objects.filter(batch__in=a)
c = BatchLogComment.last()
if c.user != request.user:
context.update({'c':c})
首先,我获取批处理模型对象,它是与当前用户关联的评论
然后我将获取第一个查询(批处理)中的 BatchLogComment 模型对象
然后获取这些评论中的最后一条
最后检查最后一条评论是否未被当前用户评论并更新上下文
我是 Django 的新手,我想查询对象内部的列表。我有一个 Batch
es 列表,每个批次都有一个 BatchComment
列表。他们俩都有一个User
属性。我想要做的是获取用户发表评论的批次,并且只获取用户未发表最后评论的批次。我怎样才能做到这一点?
目前我正在检索用户通过 Batch.objects.filter(comments__user=self.request.user)
我想要 Batch.objects.filter(comments__user=self.request.user).filter(comments_last__user!=self.request.user)
这是我的模型:
class Batch(TimeStampMixin):
note = models.TextField(max_length=1000)
image_url = models.URLField()
class Meta:
db_table = 'batches'
ordering = ['-created_at']
class BatchLogComment(TimeStampMixin):
body = models.TextField(max_length=500)
batch = models.ForeignKey(Batch, on_delete=models.CASCADE, related_name='comments')
user = models.ForeignKey(
User, on_delete=models.SET_NULL, blank=True, null=True, related_name='comments')
class Meta:
db_table = 'batch_log_comments'
ordering = ['-created_at']
我们可以使用子查询获取最后一个用户,然后进行相应的过滤:
from django.db.models import OuterRef, Subquery, Q
Batch.objects.annotate(
last_user=<b>Subquery(</b>
BatchLogComment.objects.filter(
<b>batch=OuterRef('pk')</b>
).order_by('-created_at').values('user')[:1]
<b>)</b>
).filter(
~Q(last_user=self.request.user),
comments__user=self.request.user
)
context=None
batch = Batch.objects.filter(comments__user_id=request.user.id).distinct()
batchlogcomment = BatchLogComment.objects.filter(batch__in=a)
c = BatchLogComment.last()
if c.user != request.user:
context.update({'c':c})
首先,我获取批处理模型对象,它是与当前用户关联的评论
然后我将获取第一个查询(批处理)中的 BatchLogComment 模型对象
然后获取这些评论中的最后一条
最后检查最后一条评论是否未被当前用户评论并更新上下文