Access auto increment primary field value during creation of a record with django rest framwork

断了今生、忘了曾经 提交于 2019-12-02 19:16:58

问题


I am trying to save 3 tables at once and the data is getting saved in the table But I am having issues to get inserted visit_id, vdata_id, vchild_id from each of these table. (it is the primary key with auto_created = True settings) to return the value in the api. I have tried many ways to achieve this. one attempt was this VisVisits.objects.latest('visit_id') but it gives an error something similar to <visit_id 46> is not serializer sharing my code:

serializer

class VisVisitsSerializer(serializers.ModelSerializer):

    data = VisVisitDataSerializer(many=True)
    data_child = VisVisitChildSerializer(many=True)


    class Meta:
        model = VisVisits
        read_only_fields = ['visit_id']

    def create(self, validated_data):
        visits_data = validated_data.pop('data')
        visits_child_data = validated_data.pop('data_child')

        visit = VisVisits.objects.create(**validated_data)
        #print()
        for visit_data in visits_data:
            VisVisitData.objects.create(visit=VisVisits.objects.last(), **visit_data)

        for visit__child_data in visits_child_data:
            VisVisitChild.objects.create(visit=VisVisits.objects.latest('visit_id'), **visit__child_data)
        return visit

views

@api_view(['POST'])
def SaveVisitView(request):
    if request.method == 'POST':
        visits = json.loads(request.POST.get('request'))
        visits['visits'][0].update({'user': visits['user']})
        visit = [] #need to return last inserted visit_id        
        visit_data = [] #need to return last inserted vdata_id
        visit_child = [] #need to return last inserted vchild_id

        for i in range(len(visits['visits'])):
            for z in range(len(visits['visits'][i]['data'])-1):
                visits['visits'][i]['data'][z]['parameter_id'] = visits['visits'][i]['data'][z]['VisitParamID']


                if visits['visits'][i]['data'][z]['parameter_id'] == '5' or visits['visits'][i]['data'][z]['parameter_id'] == '28':
                    visits['visits'][i].update({'data_child': [visits['visits'][i]['data'][z]]})
                    del visits['visits'][i]['data'][z]

            serializer = VisVisitsSerializer(data=visits['visits'][i])

            if serializer.is_valid():
                if visits['visits'][i]['action'] == "i":
                    serializer.save()
                    #print(serializer[i]['visit_id'])
                    # visit_save.save()
                    visit_data.append({'visit_ids':serializer[i]['visit_id']})
                    del visits['visits'][i]['data_child']

                elif visits['visits'][i]['action'] == "u" :
                    VisVisits.objects.filter(visit_id=visits['visits'][i]['visit_id']).update(is_valid=visits['visits'][i]['active'])
                    visit_data_update.append({'visit_id':serializer.data.visit_id })
                    del visits['visits'][i]['data_child']

            else:
                visit_issues.append({'local_id':visits['visits'][i]['local_id'],
                                      'validation_issues': serializer.errors,
                                      'status':status.HTTP_400_BAD_REQUEST})

        return Response({'visit_issues':visit_issues,
                         'visit_data': visit_data,
                         'status': status.HTTP_201_CREATED} )

来源:https://stackoverflow.com/questions/54534706/access-auto-increment-primary-field-value-during-creation-of-a-record-with-djang

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!