Django rest framework Django REST框架-优化queryset的嵌套序列化

Django 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

我有这样一个模型和序列化程序:

models.py

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()
,因为我们正在反向跟踪关系。:)


查看。

好吧,我知道与
预取相关的
。问题是,如何通过嵌套序列化程序来实现。它们是否仅用于序列化对象而不是查询集?是的,序列化程序仅序列化对象。查询集的处理在视图中完成。在调试工具栏中看到的查询是由对查询集的简单调用触发的,这就是为什么
预取相关的
将消除这些查询,或者更确切地说,在开始时一次获取所有查询。