Django rest framework Django REST框架-优化queryset的嵌套序列化
我有这样一个模型和序列化程序: models.pyDjango rest framework Django REST框架-优化queryset的嵌套序列化,django-rest-framework,Django Rest Framework,我有这样一个模型和序列化程序: models.py class CalendarEvent(BaseMixin): title = models.TextField(blank=True, null=True) class CalendarEventReminder(BaseMixin): event = models.ForeignKey(CalendarEvent, related_name = 'reminders') minutes = models.Cha
class CalendarEvent(BaseMixin):
title = models.TextField(blank=True, null=True)
class CalendarEventReminder(BaseMixin):
event = models.ForeignKey(CalendarEvent, related_name = 'reminders')
minutes = models.CharField()
class Meta:
managed = False
db_table = 'calendar_event_reminder'
def __str__(self):
return self.minutes
序列化程序.py
class CalendarEventSerializer(serializers.ModelSerializer):
reminders = serializers.StringRelatedField(many=True)
class Meta:
model = CalendarEvent
fields = ('title', 'reminders')
在我看来,我做了以下工作:
def test(request):
#...
event = CalendarEvent.objects.filter(id__in = [930, 935])
serializer = CalendarEventSerializer(event, many = True)
print (serializer.data)
#...
当我打开调试工具栏时,我看到数据库为每个日历事件点击提醒表两次
问题是,如何优化这种行为 最直接的方法是预取视图中CalendarEvents的CalendarEvent提醒:
# views.py
def get(request):
event = CalendarEvent.objects.filter(id__in = [930, 935]) \
.prefetch_related('reminders')
# ...
这将在获取CalendarEvents时预取所有CalendarEvent提醒
请注意,这不会触发像select\u related()
那样的sql连接。在这种情况下,我们不能使用select_related()
,因为我们正在反向跟踪关系。:)
查看。好吧,我知道与
预取相关的。问题是,如何通过嵌套序列化程序来实现。它们是否仅用于序列化对象而不是查询集?是的,序列化程序仅序列化对象。查询集的处理在视图中完成。在调试工具栏中看到的查询是由对查询集的简单调用触发的,这就是为什么预取相关的
将消除这些查询,或者更确切地说,在开始时一次获取所有查询。