【问题标题】:How do I POST multiple JSON objects如何发布多个 JSON 对象
【发布时间】:2020-10-20 05:42:44
【问题描述】:

我想知道如何使用 django-restframework 将多个 JSON 对象发布到服务器。我的数据表模型如下。

class module(models.Model):
uploaded_by=models.ForeignKey(ChangeLog,on_delete=models.CASCADE,null=True)
panel_manufacturer= models.CharField(max_length=100,null=True, blank = True)
panel_model= models.CharField(max_length=100,null=True, blank = True)
panel_serial_number = models.CharField(max_length=100)
label_pmpp=models.FloatField(null=True, blank = True)
label_lower_tolerance=models.FloatField(null=True, blank = True)
label_upper_tolerance=models.FloatField(null=True, blank = True)
label_isc=models.FloatField(null=True, blank = True)
label_voc=models.FloatField(null=True, blank = True)
label_maximum_system_voltage=models.FloatField(null=True, blank = True)
additional_panel_information = JSONField(null=True, blank = True)
def __str__(self):
    return self.panel_serial_number

而对应的序列化器就是这样

class module_Serializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name="pvlabs_testdata:module-detail")
uploaded_by = ChangeLog_Serializer(required=False)
class Meta:
    model = module
    fields = '__all__'
    validators = [module_validator]

def create(self, validated_data):
    uploaded_by_data = {"uploaded_by":self.context['request'].user, "upload_timestamp":datetime.now()}
    uploaded_by_instance = ChangeLog.objects.create(**uploaded_by_data)
    module_instance=module.objects.create(uploaded_by=uploaded_by_instance, **validated_data)
    return module_instance

当我要发布如下 JSON 时

{
"panel_manufacturer": "XYZ",
"panel_model": null,
"panel_serial_number": "EFG",
"label_pmpp": null,
"label_lower_tolerance": null,
"label_upper_tolerance": null,
"label_isc": null,
"label_voc": null,
"label_maximum_system_voltage": null,
"additional_panel_information": null
 },
 {
"panel_manufacturer": "XYZ",
"panel_model": null,
"panel_serial_number": "ABC",
"label_pmpp": null,
"label_lower_tolerance": null,
"label_upper_tolerance": null,
"label_isc": null,
"label_voc": null,
"label_maximum_system_voltage": null,
"additional_panel_information": null
},
 {
"panel_manufacturer": "XYZ",
"panel_model": null,
"panel_serial_number": "ABC",
"label_pmpp": null,
"label_lower_tolerance": null,
"label_upper_tolerance": null,
"label_isc": null,
"label_voc": null,
"label_maximum_system_voltage": null,
"additional_panel_information": null
}

我总是收到一条错误消息,上面写着“预期的字典,得到列表”。

【问题讨论】:

  • 您在哪里收到此错误:发布数据时?什么时候收到?您可能需要考虑将数据包装在 JSON 对象中。
  • 感谢您的意见罗宾。接收者期望 JSON 对象是正确的,这就是为什么当我发布一组数据时,帖子会通过。但是,我正在寻找一种在单个帖子中发送多组 JSON 对象的方法。您对此有什么建议吗?
  • 我不知道您的接收器长什么样,但有两种解决方案:您可以编辑您的接收器,以便它可以接收对象数组,或者您将对象包装在另一个对象中,如下所示: {对象:[{“panel_manufacturer”:“XYZ”,.....},{.....}]}

标签: json api post django-rest-framework


【解决方案1】:

我设法使用列表序列化程序为此创建了一个解决方案。 所以在我的视图文件中,它的编码如下

class module_ViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows groups to be viewed or edited.
"""
queryset = module.objects.all()
serializer_class = module_Serializer
permission_classes = [permissions.IsAuthenticated | HasAPIKey]
def get_serializer(self, *args, **kwargs):
    if isinstance(kwargs.get("data", {}), list):
        kwargs["many"] = True
        temp= kwargs.get("data")
        for i in range(len(kwargs.get("data"))):
            for key, value in temp[i].items():
                if " " in key or key.islower()==0:
                    n_key=str(key).replace(" ", "_").title().lower()
                    kwargs.get("data")[i][n_key] = kwargs.get("data")[i].pop(key)

    return super(module_ViewSet, self).get_serializer(*args, **kwargs)

对于我的序列化器,我的编码如下

from rest_framework import serializers
from django_restql.mixins import DynamicFieldsMixin
class BulkModuleSerializer(DynamicFieldsMixin, serializers.ListSerializer):
    def create(self, validated_data):
        result=[]
        for validated_datas in validated_data:
            uploaded_by_data = {"uploaded_by":self.context['request'].user, "upload_timestamp":datetime.now()}
            uploaded_by_instance = ChangeLog.objects.create(**uploaded_by_data)
            module_instance=module.objects.create(uploaded_by=uploaded_by_instance, **validated_datas)
            result.append(module_instance)
        return result
class module_Serializer(DynamicFieldsMixin, serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name="pvlabs_testdata:module-detail")
    uploaded_by = ChangeLog_Serializer(required=False)

    class Meta:
        model = module
        fields = '__all__'
        validators = [module_validator]
        list_serializer_class = BulkModuleSerializer

    def create(self, validated_data):
        uploaded_by_data = {"uploaded_by":self.context['request'].user, "upload_timestamp":datetime.now()}
        uploaded_by_instance = ChangeLog.objects.create(**uploaded_by_data)
        module_instance=module.objects.create(uploaded_by=uploaded_by_instance, **validated_data)
        return module_instance

这似乎对我有用。

【讨论】:

    【解决方案2】:

    您已将 JSON 数据放在方括号内。 示例:

    [
        {
            "panel_manufacturer": "XYZ",
            "panel_model": null,
            "panel_serial_number": "ABC",
            "label_pmpp": null,
            "label_lower_tolerance": null,
            "label_upper_tolerance": null,
            "label_isc": null,
            "label_voc": null,
            "label_maximum_system_voltage": null,
            "additional_panel_information": null
        },
        {
            "panel_manufacturer": "XYZ",
            "panel_model": null,
            "panel_serial_number": "ABC",
            "label_pmpp": null,
            "label_lower_tolerance": null,
            "label_upper_tolerance": null,
            "label_isc": null,
            "label_voc": null,
            "label_maximum_system_voltage": null,
            "additional_panel_information": null
        }
    ]
    

    【讨论】:

    • 它说“'预期的字典,得到列表'。”所以它已经在发送一个列表。它让接收者期待一个 json 对象左右。
    • 谢谢努兰。我确实尝试过,但是当我发布数据时它仍然给我同样的错误。
    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2015-10-16
    • 2021-08-02
    相关资源
    最近更新 更多