Django Rest框架嵌套序列化程序是否延迟加载?

2024-04-16 23:07:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我很喜欢使用Django Rest框架,并从中获得了很多乐趣。 但有一件事让我很不安。我有一个模型,在这个模型中有很多外国的钥匙。i、 电子邮件:

class Order(models.Model):
    bought_by = models.ForeignKey(User, related_name='bought_orders')
    bought_on = models.DateTimeField(default=datetime.datetime.now, blank=True)
    category = models.ForeignKey(OrderCategory, related_name='orders')
    article = models.ForeignKey(Article, related_name='orders')
    supplier = models.ForeignKey(Supplier, related_name='orders')
    purpose = models.CharField(null=True, blank=True, max_length=255)
    payment_method = models.ForeignKey(PaymentMethod, related_name='orders')
    order_number = models.CharField(max_length=255)
    delivery_received_on = models.DateTimeField(null=True, blank=True)
    delivery_received_by = models.ForeignKey(User, null=True, blank=True, related_name='received_orders')
    tags = TaggableManager(blank=True)

所以我使用好的ModelSerializer,顺便说一句,我使用嵌套序列化器,即:

^{pr2}$

问题是请求只需要50个订单就需要1.7秒。 好吧,那真是出乎意料。。。我打开我的Django调试工具并查看sql语句。Django Rest Framework或Django为每个订单打开一个新连接并执行select语句。在

有没有可能绕过这个问题的方法? 关闭延迟加载或我可以在序列化程序中更改的功能?在

非常感谢!在


Tags: djangoname模型resttruebymodelsnull
1条回答
网友
1楼 · 发布于 2024-04-16 23:07:56

您的问题来自查询集,而不是序列化程序。默认情况下,Django查询集不遵循关系,因此不填充相关字段。 为了解决这个问题,您必须更改查询集,将^{}用于OneToOne和{}字段,使用^{}表示{}字段。在

假设您使用的是DRF ViewSets,那么您可以将OrderViewSet中的get_queryset方法改为如下所示:

def get_queryset(self):
    return Order.objects.select_related(
            'bought_by', 'category', 'article', 'supplier',
            'payment_method', 'delivery_received_by'
        ).prefetch_related(
            'tags', 'invoice_documents'
        )

相关问题 更多 >