【问题标题】:HTTP requests for nested objects嵌套对象的 HTTP 请求
【发布时间】:2015-10-25 20:32:11
【问题描述】:

是否可以使用库“requests”(python 的 HTTP 库)在 django rest 框架中发布和更新嵌套对象?

我在序列化程序中创建了一个新的创建方法,但我不能在 shell 之外发布,也不能在请求库或 api webview 中发布。

我的序列化器:

class QualityParameterSerializer(serializers.ModelSerializer):

    class Meta:
        model = QualityParameter
        fields = ("id","name", "value")


class ProductQualityMonitorSerializer(serializers.ModelSerializer):

    parameters = QualityParameterSerializer(many=True)

    class Meta:
        model = ProductQualityMonitor
        fields = ("id","product_name", "area", "timeslot", "processing_line",
          "updated_on",'parameters')

    def create(self, validated_data):
        params_data = validated_data.pop('parameters')
        product = ProductQualityMonitor.objects.create(**validated_data)
        for param_data in params_data:
            QualityParameter.objects.create(product=product, **param_data)
        return product

POST HTTP request

【问题讨论】:

  • 您想使用 python 'requests' 将数据发布到具有 DRF 处理程序的网络服务器吗?
  • 我正在使用 python 'requests' 和美味的派,现在我正在将系统移动到休息框架,我正在尝试调整我已经拥有的代码。我不知道是否可以继续使用 python 'requests'。有最简单的方法吗?
  • 如果您指的是docs.python-requests.org/en/latest,那么这是一个客户端(某种)库,而 Django Rest Framework 是一个服务器端库。我看不出它们为什么不应该一起工作,一个在客户端,一个在服务器上——它们之间的粘合剂应该是基于 HTTP 的 JSON。我说对了吗?

标签: python django post httprequest django-rest-framework


【解决方案1】:

如果我可以为您的序列化程序建议以下表格:

from django.db import transaction

class ProductQualityMonitorSerializer(serializers.ModelSerializer):

    parameters = QualityParameterSerializer(many=True)

    class Meta:
        model = ProductQualityMonitor
        fields = (
            "id",
            "updated_on",
            "product_name", 
            "area", 
            "timeslot", 
            "processing_line", 
            "parameters", 
        )

    def create(self, validated_data):
        # we will use transactions, so that if one of the Paramater objects isn't valid
        # that we will rollback even the parent ProductQualityMonitor object creation, 
        # leaving no dangling objects in the database
        params_data = validated_data.pop('parameters')
        with transaction.atomic():
            product = ProductQualityMonitor.objects.create(**validated_data)
            # you can create the objects in a batch, hitting the dB only once
            params = [QualityParameter(product=product, **param) for param in params_data]
            QualityParameter.objects.bulk_create(params)

        return product

关于使用python requests 库:发布到django后端时需要注意以下几个方面:

  • 您必须在请求中提供有效的 CSRF 令牌;这样做的方式是通过 csrf-token cookie;
  • 您必须提供正确的身份验证标头/令牌/cookie;这是您的选择,取决于您如何在 DRF 后端实现此功能
  • 如果这是从一个域到另一个域的请求,那么您必须注意 CORS 设置。

更重要的是:您已经尝试过什么但没有奏效?

【讨论】:

  • 我发现错误:post http 请求中的一个质量参数的名称与模型中的不同,我有“histogram frequencEIs”而不是“histogram frequencIEs”。这么愚蠢的错误,对不起!您的 create 方法运行良好,例如我的。
猜你喜欢
  • 2021-11-16
  • 2015-03-19
  • 2018-11-27
  • 2023-03-25
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多