【发布时间】:2015-10-04 03:07:58
【问题描述】:
ListAPIView(下面的代码)的默认行为是序列化所有 Report 对象和每个 Report 对象的嵌套 Log 对象。如果我只想在每个报告中显示最新的日志对象怎么办?我该怎么做呢?
# models.py
class Log(models.Model):
# ...
report = models.ForeignKey(Report)
timestamp = models.DateTimeField(default=datetime.datetime.now)
class Report(models.Model):
code = models.CharField(max_length=32, unique=True)
description = models.TextField()
# serializers.py
class LogSerializer(serializers.ModelSerializer):
class Meta:
model = Log
class ReportSerializer(serializers.ModelSerializer):
log_set = LogSerializer(many=True, read_only=True)
class Meta:
model = Report
fields = ('code', 'description', 'log_set')
# views.py
class ReportListView(generics.ListAPIView):
queryset = Report.objects.all()
serializer_class = ReportSerializer
我知道我可以通过使用 SerializerMethodField 来做到这一点,但这可能是一个代价高昂的操作,因为将有一个额外的 SQL 查询来为每个 Report 对象检索适当的 Log 对象。
class ReportSerializer(serializers.ModelSerializer):
latest_log = serializers.SerializerMethodField()
class Meta:
model = Report
def get_latest_log(self, obj):
try:
latest_log = Log.objects.filter(report_id=obj.id).latest('timestamp')
except Log.DoesNotExist:
latest_log = None
return latest_log
如果我有 1000 个报表对象,如果我想全部呈现它们,将会有 1000 个额外的查询。除了使用分页之外,我如何避免那些额外的查询?谁能指出我正确的方向?谢谢!
编辑:关于可能的重复标签,Mark 单独提供的链接并没有完全为我清除图片。 Todor 的回答更加明确。
【问题讨论】:
-
嘿,马克!我在您发布的链接中支持您的评论和您的答案,但我将 Todor 的答案标记为正确答案,因为它更完整。
标签: django django-rest-framework