Как отправить несколько списков полей данных в дочернюю модель вместе с родительской моделью - PullRequest
0 голосов
/ 31 мая 2019

У меня есть две модели: визит (родительская модель) и визитка (дочерняя модель).когда я публикую данные (VisitAccessories), добавляется только последний элемент списка и создается запись.но другие элементы игнорируются.

models.py

class Visit(models.Model):
    name = models.CharField(max_length=200, name="name")


class VisitAccessories(models.Model):
     title = models.CharField(max_length=100)
     code = models.CharField(max_length=100, null=True, blank=True)
     accessories_photo = models.FileField(upload_to="accessories/", null=True, blank=True)
     description = models.TextField(null=True, blank=True)
     visit = models.ForeignKey(Visit,on_delete=models.CASCADE)

serializer.py

class VisitAccessoriesSerializers(serializers.ModelSerializer):

    class Meta:
       model = VisitAccessories
       exclude = ("visit",)#visit is foregin key to visit model


class ListAccessoriesSerializers(serializers.ModelSerializer):
     visit_accessories = VisitAccessoriesSerializers(many=True,source='visitaccessories_set', required=False,)

      class Meta:
         model = VisitAccessories
         exclude = ("visit",) #visit is foregin key to visit model

class VisitSerializers(serializers.ModelSerializer):
      visit_accessories = VisitAccessoriesSerializers(many=True, source='visitaccessories_set', required=False)
    class Meta:
       model = Visit
       fields = ('__all__')

views.py

    def post(self, request):
       serializer = VisitSerializers(data=request.data)
       accessories_serializer = ListAccessoriesSerializers(data=request.data)
       if serializer.is_valid(raise_exception=ValueError) and accessories_serializer.is_valid(raise_exception=ValueError):
           visit_obj = serializer.save() # Visit Created
           accessories_serializer.save(visit=visit_obj) # VisitAccessories
           return Response(serializer.data, status=status.HTTP_201_CREATED)
       return Response(serializer.error_messages, status=status.HTTP_400_BAD_REQUEST)

переменная accessories_serializer данные, которые я получаю,

ListAccessoriesSerializers(data=<QueryDict: {'name': ['Axxx'], 'gender': ['M'], 'mobile': ['900000'], 'visit_time': ['2019-06-04T17:00:56.901634+05:30'], 'to_meet': ['15'], 'title': ['pppp', 'ttttttt', 'vvvvv'], 'accessories_photo': [<InMemoryUploadedFile: Syndicate_Bank.svg.png (image/png)>, <InMemoryUploadedFile: maruti-suzuki-reuters-small.jpg (image/jpeg)>, <InMemoryUploadedFile: rupee11.jpg (image/jpeg)>]}>):

только из списка заголовков vvvvv (последний элемент) 1 запись создается.вместо 3 записей

1 Ответ

0 голосов
/ 31 мая 2019

Попробуйте это

class VisitSerializers(serializers.ModelSerializer):

    visit_accessories = VisitAccessoriesSerializers(many=True, source='visitaccessories_set', required=False)

    class Meta:
       model = Visit
       fields = ('__all__')

    def create(self, validated_data):
        request = self.context.get('request')
        accessories_data = validated_data.pop('visit_accessories') # pop the nested data
        serializer = VisitSerializers(data=validated_data)
        instance = super().create(validated_data) # create base object

        accessories_serializer = ListAccessoriesSerializers(many=True,
            context={'request': request, 'visit_id': instance.id}
        )
        accessories_serializer.create(accessories_data) # create nested objects
        return instance
...