Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架-嵌套序列化程序是否延迟加载?_Python_Django_Serialization_Django Rest Framework - Fatal编程技术网

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

Python Django Rest框架-嵌套序列化程序是否延迟加载?,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,我很喜欢使用Django Rest框架,并从中获得了很多乐趣。 但是有一件事让我不安。我有一个模型,在这个模型中有很多外国人。i、 e: class Order(models.Model): bought_by = models.ForeignKey(User, related_name='bought_orders') bought_on = models.DateTimeField(default=datetime.datetime.now, blank=True)

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

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框架或Django为每个订单打开一个新连接并执行select语句

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


多谢各位

您的问题来自查询集,而不是序列化程序。默认情况下,Django查询集不遵循关系,因此不会填充相关字段。 为了解决此问题,您必须将查询集更改为用于
OneToOne
ForeignKey
字段以及
manytoman
字段

假设您正在使用DRF
viewset
,您可以将
OrderViewSet
中的
get\u 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'
        )

非常感谢你!这对我帮助很大:)祝你今天愉快