0

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'

1 Answer 1

1

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)
Sign up to request clarification or add additional context in comments.

8 Comments

Should I use ListSerializer instead of ModelSerializer in this case?
@Shahabaz no, Django will choose correct instance automatically.
Okay. I got some error while updating my code this way. Can you help me on the error log ?
@Shahabaz do you have quotes around issue field in serializer's meta: fields = ('id', 'issue')? In your question it's nt quoted.
My bad it is already with quotes. FYI The existing API is working just fine l wanted this bulk insert. (Have updated the question)
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.