Mic*_*ski 2 python django serialization django-rest-framework
我很可爱使用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)
Run Code Online (Sandbox Code Playgroud)
所以我使用好的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)
Run Code Online (Sandbox Code Playgroud)
问题是请求只需要大约1.7秒,只需要50个订单.好的,这是意料之外的......我打开了我的Django调试工具并查看了sql语句.Django Rest Framework或Django为每个订单打开一个新连接并执行select语句.
有没有办法解决这个问题?关闭延迟加载或我可以在序列化器中更改的内容?
非常感谢你!
您的问题来自查询集,而不是序列化程序.默认情况下,Django查询集不遵循关系,因此不会填充相关字段.为了解决这个问题,你必须改变你的查询集使用select_related了OneToOne和ForeignKey领域,prefetch_related为ManyToMany各个领域.
所以假设你正在使用DRF ViewSets,你可以改变你的get_queryset方法OrderViewSet:
def get_queryset(self):
return Order.objects.select_related(
'bought_by', 'category', 'article', 'supplier',
'payment_method', 'delivery_received_by'
).prefetch_related(
'tags', 'invoice_documents'
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1357 次 |
| 最近记录: |