【问题标题】:How to serialize and save POST request from JavaScript in Django如何在 Django 中序列化和保存来自 JavaScript 的 POST 请求
【发布时间】:2019-11-15 03:42:42
【问题描述】:

我正在从 JavaScript 发送一个发布请求。请求是一个对象数组。如果我不对请求进行字符串化,Django 不会返回我实际发送的内容。它只返回[Object object],我无法访问数据。

我尝试过的:

  1. views.py 上创建了一个函数,允许我识别请求及其内容、格式化内容并将其作为参数传递给序列化程序以执行请求。
  2. 分离 2 个不同模型中的字段并创建 2 个序列化程序,将一个嵌套在另一个序列化程序中,然后创建一个函数来执行创建
# views.py
def perform_create(self, request, *args,**kwargs):
        post_request = self.request.POST['registers']
        print(post_request)
        a = json.loads(post_request)
        serialized_data = request.data
        request.data['item1'] = a['item1']
        request.data['item2'] = a['item2']
        request.data['photo1'] = a['photo1']
        request.data['photo2'] = a['photo2']
        print(request.data)
        serializer = InstalationReportSerializer(data=request.data, many= True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data )
        return Response(serializer._errors)
# models.py
class ModelContained(CommonInfo):
    item1 = models.CharField(
        _('item1'),max_length=200, db_column='item_1', blank=True, 
        null=True, help_text=_('item 1'),)
    item2 = models.CharField(
        _('item2'), max_length=200, db_column='item_2', blank=True, 
        null=True, help_text=_('item 2'),)


class ModelContainer(CommonInfo):
    header = models.ForeignKey(
        ModelContained, 
        verbose_name=_('header'),db_column='random_name',
        on_delete= models.CASCADE, related_name='random',
        related_query_name='random',help_text=_('contained model')
    )
    initial_photos = models.ImageField(
        _('initial_photos'), db_column='initial_photos', blank=True,
        null=True, upload_to='photo/', help_text=_('before'))
    end_photos = models.ImageField(
        _('end_photos'), db_column='end_photos', blank=True, null=True,
        upload_to='photo', help_text=_('after')) 

# serializer.py
  class ModelContainerSerializer(serializers.HyperlinkedModelSerializer):
    class Meta: 
        model = ModelContainer
        fields = (
            'header', 'initial_photos', 'end_photos'
        )
        read_only_fields = ('id')

ModelContainedSerializer(serializers.HyperlinkedModelSerializer):
registers = ModelContainerSerializer(source='ModelContainer_set', many = True)

    class Meta: 
        model = ModelContained
        fields = (
            'id', 'item1', 'item2','registers'
        )
        read_only_fields = ('id',)

    def create(self, validated_data):
        registers_render = validated_data.pop('registers')
        register = InstallationReport.objects.create(**validated_data)

        return register

前端正在发送:

{
  item1: "someinfo",
  item2: "another info",
  registers: Array(1)
}

数组包含:

0:
end_photos: File {name: "WhatsApp Image 2019-05-14 at 5.28.02 PM(3).jpeg", lastModified: 1557873045827, lastModifiedDate: Tue May 14 2019 17:30:45 GMT-0500 (Colombia Standard Time), webkitRelativePath: "", size: 124922, …}
initial_photos: File {name: "WhatsApp Image 2019-05-14 at 5.28.00 PM.jpeg", lastModified: 1557872985264, lastModifiedDate: Tue May 14 2019 17:29:45 GMT-0500 (Colombia Standard Time), webkitRelativePath: "", size: 99106, …}

【问题讨论】:

  • 为什么不对前端请求进行字符串处理?
  • 因为文件字段消失,只允许1个表单,前端发送一个字段数组,所以大部分时间是发送2个或多个表单,stringify时,第二个表单会产生错误'无效的 json'

标签: javascript python django-rest-framework


【解决方案1】:

如果不了解您如何在客户端代码中发送和接收数据,那么在这里诊断问题有点困难。但是,[object Object] 是普通旧 JavaScript 对象的 toString 表示:例如,此代码将发出的内容:

const foo = {};
console.log(foo.toString());

任何时候你试图输出一个字符串应该是的对象时,你都会在你的渲染中得到这个。因此,我认为您的问题根本不在后端代码中,而只是在数据返回给您后您对数据的处理方式。快速浏览一下浏览器开发工具中的 Network 标签就足以证明这一点,但您也可以在显示之前在客户端代码中尝试简单的JSON.stringify(theReturnedData)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2019-04-28
    • 2023-03-03
    相关资源
    最近更新 更多