【发布时间】:2021-09-02 10:45:25
【问题描述】:
我有 2 个模型:发布和评论。像这样:
class Post(models.Model):
content = models.TextField()
class Comment(models.Model)
content = models.TextField()
owner = models.ForeignKey(User, null=False, on_delete=models.CASCADE)
post_parent = models.ForeignKey(
Post,
on_delete=models.CASCADE,
null=False,
db_column='post_parent',
related_name='comments',
)
comment_ref = models.ForeignKey(
'self',
on_delete=models.CASCADE,
null=True,
related_name='children_comment'
)
假设 cmets 可以有 1 个级别的子 cmets。使用帖子的 ID,我想获得 5 个最新的 cmets(不是子评论),每个都预取了 3 个最新的子 cmets。 搜索后我目前的实现是:
sub_comments = Comment.objects.filter(
comment_ref=OuterRef('pk'),
post_parent=post_id
).order_by('-timestamp').values_list('id', flat=True)[:3]
queryset = Comment.objects.filter(
comment_ref=None,post_parent=post_id
).select_related('owner').prefetch_related(
Prefetch('children_comment', queryset=Comment.objects.filter(
id__in=Subquery(sub_comments)
), to_attr="cmt"))
那行不通。它不限制预取子 cmets 的数量。请帮助我:D
【问题讨论】:
-
正如@dean 所说,我忘记了模型中的时间戳字段。
标签: django django-models limit self-reference prefetch