【问题标题】:Django convert queryset to a listDjango 将查询集转换为列表
【发布时间】:2021-11-08 20:12:59
【问题描述】:

我正在尝试使用 jquery ajax 和 django restframework 进行批量插入。当我使用 django restframework 接口上传我的数据时,它可以工作,当我打印 request.data 时,我得到了这个 [{'name': 'Tenant 1', 'email': 'tenant1@gmail.com', 'phone_number': 619}, {'name': 'Tenant 2', 'email': 'tenant2@gmail.com', 'phone_number': 911}]

但是,当我使用 jquery 上传它时,我得到的数据是

<QueryDict: {'name': ['Tenant 1', 'Tenant 2'], 'calling_code': ['254', '254'], 'phone_number': ['619', '911'], 'email': ['tenant1@gmail.com', 'tenant2@gmail.com']}>

这是我的代码: 在租户Add.html:

$(document).on('submit', '#create_tenant_bulk', function (event) {
    var form_data = new FormData(this);
    event.preventDefault();
    $.ajax({
        method: 'POST',
        url: '{% url "tenants:tenant-listcreate" %}',
        data: form_data,
        mimeType:'application/json',
        contentType: false,
        dataType: "json",
        processData: false,

在我看来.py:

class CreateTenantAPIView(generics.ListCreateAPIView):
    queryset = Tenant.objects.all()
    serializer_class = TenantSerializer
    
    def create(self, request, *args, **kwargs):
        print('yaaaaaaaaaaaaaaaaaaaaaaaazweeeeeeeeeeeeeh')
        
        print(request.data)
        print(type(request.data))
        many = isinstance(request.data, list)
        serializer = self.get_serializer(data=request.data, many=many)
        if serializer.is_valid(raise_exception=True):
            saved_user= serializer.save(added_by=self.request.user)
            return Response({
            'success': 'user has been added succsfully',
            })
        else:
            return Response({
            'error': 'you done f@#ckd up',
            'error_list':serializer.errors.items()
            })

所以,我想把它变成这样:

<QueryDict: {'name': ['Tenant 1', 'Tenant 2'], 'calling_code': ['254', '254'], 'phone_number': ['619', '911'], 'email': ['tenant1@gmail.com', 'tenant2@gmail.com']}>

进入这个:

[{'name': 'Tenant 1', 'email': 'tenant1@gmail.com', 'phone_number': 619}, {'name': 'Tenant 2', 'email': 'tenant2@gmail.com', 'phone_number': 911}]

【问题讨论】:

标签: python django list django-queryset bulkinsert


【解决方案1】:

所以这是问题的临时解决方案,希望有更优雅的方法来做到这一点

def query_to_list(request):
    data = {'name': ['Tenant 1', 'Tenant 2'], 'calling_code': ['254', '254'], 'phone_number': [
        '619', '911'], 'email': ['tenant1@gmail.com', 'tenant2@gmail.com']}
    records = list(data.values())
    record_data = []
    i = 0
    while i < len(data['name']):
        record_data.append(
            {
                'name': records[0][i],
                'calling_code': records[1][i],
                'phone_number': records[2][i],
                'email': records[3][i]
            })

        i += 1
    print(record_data)
    return HttpResponse(record_data)

【讨论】:

    【解决方案2】:

    我让它更动态一点,以防有人想使用它

    我首先创建了一个名为 bulk_insert.py

    的文件
    def append_record(length, title, data, i):
        j = 0
        sub_record = {}
        while j < length:
            sub_record.update({title[j] : data[j][i]})         
            j += 1
        return sub_record
        
    def bulk_data_fomart(raw_data):
        data=dict(raw_data)
        records_title = list(data)
        records = list(data.values())
        record_data = []
        i = 0
        while i < len(data[records_title[0]]):
            if(records[0][i]):
                record_data.append(append_record(len(records_title),records_title, records,i))
            i += 1
        return record_data
    

    之后,只需导入文件并在我的函数中使用它即可:

       class ListCreate_tenant(generics.ListBulkCreateAPIView):
            queryset = Tenant.objects.all()
            serializer_class = TenantSerializer
            success_insert='Your data has been added'
            def create(self, request, format=None, *args, **kwargs):
                bulk_data=bulk_data_fomart(request.data)
                many = isinstance(bulk_data, list)
                serializer = self.get_serializer(data=bulk_data, many=many)
                if serializer.is_valid():
                    saved_user2 = serializer.save(added_by=self.request.user)
                    return Response({
                        'success': self.success_insert,
                        'response': serializer.data[0],
                    })
                else:
                    error_response = fix_errors_bulk(serializer.errors)
                    return Response({
                        'error': error_response
                })
    

    【讨论】:

      猜你喜欢
      • 2015-08-16
      • 2020-04-01
      • 2015-12-21
      • 2020-01-09
      • 1970-01-01
      • 2020-11-14
      • 2022-01-14
      • 2017-01-23
      • 1970-01-01
      相关资源
      最近更新 更多