gpt4 book ai didi

python - Django Rest Framework - 嵌套序列化程序是延迟加载的吗?

转载 作者:行者123 更新时间:2023-11-28 20:20:56 25 4
gpt4 key购买 nike

我很喜欢使用 Django Rest Framework,并且从中获得了很多乐趣。但是有一件事让我感到不安。我有一个模型,在这个模型中有很多外键。即:

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,顺便说一句,我使用了嵌套序列化程序,即:

class ReadOrderSerializer(ModelSerializer):
created = DateTimeField()
updated = DateTimeField()
bought_by = UserSerializer()
category = OrderCategorySerializer()
article = ArticleSerializer()
supplier = SupplierSerializer()
payment_method = PaymentMethodSerializer()
tags = TagListSerializerField()
invoice_documents = InvoiceDocumentSerializer(many=True)

问题是,仅 50 个订单的请求大约需要 1.7 秒。好吧,这是意想不到的……我打开我的 Django 调试工具并查看了 sql 语句。 Django Rest Framework 或 Django 为每个命令打开一个新连接并执行一个选择语句。

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

非常感谢!

最佳答案

您的问题来自查询集,而不是序列化程序。默认情况下,Django 查询集不遵循关系,因此不会填充相关字段。为了解决这个问题,您必须更改查询集以使用 select_related对于 OneToOneForeignKey 字段和 prefetch_related对于 ManyToMany 字段。

假设您正在使用 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'
)

关于python - Django Rest Framework - 嵌套序列化程序是延迟加载的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29608388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com