简体   繁体   中英

Django - sending JSON arrary on POST request

I am creating a dynamic form based on the number of records available in the DB. The input fields are dynamically set during rendering. Once the values are set I want them to be bulk inserted into the DB. (I am using modelSerializer class for serialization)

For example

<form id="issue_form">
<input name="issue" value="random"/>
<input name="issue" value="sensor"/>
<input name="issue" value="human"/>
<input name="issue" value="pc"/>
</form>

<script>
$(docment).on('submit','#issue_form',function(event){
     event.preventDefault();
var data = $(this).serializeArray();

$.ajax({"url":"api/data",data :data }).done(function(res){
   console.log(data)
})
})

Model:

class ParetoAnalysis(models.Model):
    shift                   = models.ForeignKey(Shift, on_delete=models.CASCADE)
    line                    = models.ForeignKey(Line, on_delete=models.CASCADE)
    start_time              = models.DateTimeField(default=datetime.now)
    end_time                = models.DateTimeField(default=datetime.now)
    end_point               = models.ForeignKey(EndPoint, on_delete=models.CASCADE)
    issue                   = models.ForeignKey(DownTimeIssue, on_delete=models.CASCADE)
    custom_comments         = models.CharField(max_length=1000,blank=True)
    created_by              = models.ForeignKey(User, on_delete=models.CASCADE,null=True)
    created_date            = models.DateTimeField(default=datetime.now,blank=False)

Serializer:

class ParetoAnalysisSerializer(serializers.ModelSerializer):
    duration = serializers.SerializerMethodField()        #duration in seconds

    issue = serializers.PrimaryKeyRelatedField(
    read_only=False, queryset=DownTimeIssue.objects.all()) 

    line = serializers.PrimaryKeyRelatedField(
    read_only=False, queryset=Line.objects.all())

    shift = serializers.PrimaryKeyRelatedField(
    read_only=False, queryset=Shift.objects.all())

    end_point = serializers.PrimaryKeyRelatedField(
    read_only=False, queryset=EndPoint.objects.all())

    #created_by_id = 1 #serializers.SerializerMethodField('_user')
    created_by_id = serializers.SerializerMethodField()


    def get_created_by_id(self,pareto):
        return 1

    def get_duration(self, pareto):
        return  (pareto.end_time-pareto.start_time).seconds

    class Meta:
        model = ParetoAnalysis
        fields = ('custom_comments', 'end_point', 'issue','line','shift', 'created_by_id', 'created_date', 'end_time', 'start_time','duration')

view

class ParetoAnalysisViewSet(viewsets.ModelViewSet):
    queryset = ParetoAnalysis.objects.all()
    serializer_class = ParetoAnalysisSerializer

    def create(self, request):
        serializer = self.get_serializer(data=request.data, many=True)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

I want to achieve storing bulk JSON value on post request to the model.

For instance

json = [{"name":"random"},{"name":"sensor"},{"name":"human"},{"name":"pc"}]

Error Log when default API form submitted

    return  (pareto.end_time-pareto.start_time).seconds
    AttributeError: 'collections.OrderedDict' object has no attribute 'end_time'

Error Log when send bulk json

Traceback (most recent call last):
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py", line 158, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py", line 156, in _get_response
    response = response.render()
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\template\response.py", line 106, in render
    self.content = self.rendered_content
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\response.py", line 72, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\renderers.py", line 718, in render
    context = self.get_context(data, accepted_media_type, renderer_context)
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\renderers.py", line 691, in get_context
    'post_form': self.get_rendered_html_form(data, view, 'POST', request),
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\renderers.py", line 496, in get_rendered_html_form
    return self.render_form_for_serializer(existing_serializer)
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\renderers.py", line 522, in render_form_for_serializer
    serializer.data,
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\serializers.py", line 742, in data
    ret = super(ListSerializer, self).data
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\serializers.py", line 266, in data
    self._data = self.get_initial()
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\serializers.py", line 577, in get_initial
    return self.to_representation(self.initial_data)
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\serializers.py", line 660, in to_representation
    self.child.to_representation(item) for item in iterable
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\serializers.py", line 660, in <listcomp>
    self.child.to_representation(item) for item in iterable
  File "E:\Personal\GM\Godrej\Mirror Code v1\report\serializers.py", line 82, in to_representation
    data =  super(ParetoAnalysisSerializer, self).to_representation(instance)
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\serializers.py", line 504, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "C:\Users\5450\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\relations.py", line 257, in to_representation
    return value.pk
AttributeError: 'int' object has no attribute 'pk'

You need to use serializer's many=True argument for this inside viewset create() method:

from rest_framework import status
from rest_framework.response import Response

class IssueViewSet(viewsets.ModelViewSet):
    queryset = Issue.objects.all()
    serializer_class = IssueSerializer

    def create(self, request):
        if not isinstance(request.data, dict):
            serializer = self.get_serializer(data=request.data, many=True)
        else:
            serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM