0

I am trying to do a bulk insert using jquery ajax and django restframework. When I upload my data using the django restframework interface, it works and when I print the request.data I get this [{'name': 'Tenant 1', 'email': 'tenant1@gmail.com', 'phone_number': 619}, {'name': 'Tenant 2', 'email': 'tenant2@gmail.com', 'phone_number': 911}]

However, when I upload it using jquery, I get the data as

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

here is my code: in tenantsAdd.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,

In my views.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()
            })

So baically, I am trying to turn this:

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

Into this:

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

2 Answers2

0

So this is a temporary solution to the problem, hopefully there is a more elegant way of doing this

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)
0

I made it a little bit more dynamic incase there's anyone who wants to use it

I started by creating a file called 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

After that it's just a matter of importing the file and using it in my function as such:

   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
            })