我有基于2个模型的Django Rest API序列化器,Book和Chapter
class Book(models.Model):
title = models.TextField(unique=True)
description = models.TextField(blank=True, null=True)
published_at = models.DateTimeField(default=timezone.now, db_index=True)
added_at = models.DateTimeField(auto_now_add=True, db_index=True)
modified_at = models.DateTimeField(auto_now=True, db_index=True)
class Chapter(models.Model):
book = models.ForeignKey(
Book, on_delete=models.CASCADE,
related_name='chapters', db_index=True
)
published_at = models.DateTimeField(default=timezone.now, db_index=True)
added_at = models.DateTimeField(auto_now_add=True, db_index=True)
modified_at = models.DateTimeField(auto_now=True, db_index=True)
在图书序列化程序中,我想要2个自定义字段
first_chapter
last_chapter
每个都有Chapter
模型的对象,您可以从字段名称中了解到第一个和最后一个对象的顺序是published_at
字段
Chapter模型有一个Book的外键。
我尝试了类似下面的东西,以获得最后一章
class LastChapterField(serializers.RelatedField):
def get_queryset(self):
return core_models.Chapter.objects\
.filter(book=M.OuterRef("pk"))\
.select_related("number")\
.order_by("-published_at")[:1]
但是我没有看到最后一章包含在我的结果中,即使它在Book Serializer的fields
中明确提到
我希望在返回结果时使用完整的对象,并且我希望能够在Chapter
模型对象的这些嵌套字段之一(first_chapter或last_chapter)上使用order by。
1条答案
按热度按时间a6b3iqyw1#
您可以使用SerializerMethodField来执行此操作,该字段将检索所需的对象并在其中使用其他序列化程序:
然后,您可以在视图中使用序列化程序,例如: