簡體   English   中英

Django - 如何在過濾器方法中查詢列表

[英]Django - How to query a list inside of a filter method

我是 Django 的新手,我想查詢 object 內的列表。 我有一個Batch列表,每個批次都有一個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=Subquery(
        BatchLogComment.objects.filter(
            batch=OuterRef('pk')
        ).order_by('-created_at').values('user')[:1]
    )
).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})

首先我得到批次 model 對象,它是與當前用戶相關的評論

然后我得到第一個查詢(批處理)中的 BatchLogComment model 對象

然后得到這些評論中的最后一條

最后檢查當前用戶是否未評論最后一條評論並更新上下文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM