如何使用附加过滤的相关对象作为 Django 中的字段获取结果?
How to get result with additional filtered related objects as a field in Django?
我想在一个查询中获取所有数据,所以我需要通过相关对象的过滤器(而不是父对象过滤器)添加一些来自相关对象的字段结果。
def get_queryset(self):
return Mailbox.objects\
.filter(owner=self.request.user.id)\
.prefetch_related('letter_set')\
.annotate(
new_letter_count=Count(
'letter',
filter=Q(letter__read_at=None)
),
total_count=Count('letter'),
latest_letter_datetime=Max('letter__created_at'),
### #################### ###
### THE QUESTION IS HERE ###
### #################### ###
latest_letter_CONTENT= #(What code here could be work?)#
### I wnat to get the latest letter content
)
嗯,我会假设模型 Letter
中有一个 ForeignKey
指向模型 MailBox
。
您可以为此使用 Subquery:
# I'm assuming here a couple of things:
# The fields content and date_created exist in your Letter model,
# if there is no date created field, use instead whatever you are using for
# establish some sort of order creation.
MailBox.objects.annotate(
last_letter_content = Subquery(
Letter.objects.filter(mailbox=OuterRef('pk')).order_by('-date_created').values('content')[:1]
)
)
我想在一个查询中获取所有数据,所以我需要通过相关对象的过滤器(而不是父对象过滤器)添加一些来自相关对象的字段结果。
def get_queryset(self):
return Mailbox.objects\
.filter(owner=self.request.user.id)\
.prefetch_related('letter_set')\
.annotate(
new_letter_count=Count(
'letter',
filter=Q(letter__read_at=None)
),
total_count=Count('letter'),
latest_letter_datetime=Max('letter__created_at'),
### #################### ###
### THE QUESTION IS HERE ###
### #################### ###
latest_letter_CONTENT= #(What code here could be work?)#
### I wnat to get the latest letter content
)
嗯,我会假设模型 Letter
中有一个 ForeignKey
指向模型 MailBox
。
您可以为此使用 Subquery:
# I'm assuming here a couple of things:
# The fields content and date_created exist in your Letter model,
# if there is no date created field, use instead whatever you are using for
# establish some sort of order creation.
MailBox.objects.annotate(
last_letter_content = Subquery(
Letter.objects.filter(mailbox=OuterRef('pk')).order_by('-date_created').values('content')[:1]
)
)