Django - 如何在过滤器方法中查询列表

Django - How to query a list inside of a filter method

我是 Django 的新手,我想查询对象内部的列表。我有一个 Batches 列表,每个批次都有一个 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 模型对象

然后获取这些评论中的最后一条

最后检查最后一条评论是否未被当前用户评论并更新上下文