Загрузка нескольких изображений в DRF на CREATE - PullRequest
0 голосов
/ 25 января 2019

Я хотел бы иметь модель, для которой вы можете загрузить несколько изображений при создании (публикации).

В веб-представлении DRF для API / животных / в форме сообщения я хотел бы добавить несколько изображений и создать новое животное с прикрепленными изображениями.

Допустим, у меня есть следующие модели:

class Animal(models.Model):
    slug = models.CharField(max_length=20, unique=True)


class AnimalImage(models.Model):
    animal = models.ForeignKey(Animal, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='animal_pics/')

У меня есть следующие сериализаторы:

class AnimalImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = AnimalImage
        fields = ('animal', 'image', )


class AnimalSerializer(serializers.HyperlinkedModelSerializer):
     images = AnimalImageSerializer(many=True)
     class Meta:
         model = Animal
         lookup_field = 'slug'
         extra_kwargs = {
             {'url': {'lookup_field': 'slug'}
         }
         fields = ('slug', 'images', )

У меня есть следующие остальные виды:

 class AnimalViewSet(viewsets.ModelViewSet):
     queryset = Animal.objects.all()
     serializer_class = AnimalSerializer
     lookup_filed = 'slug'
     parser_classes = (JSONParser, MultiPartParser, FormParser)

Когда я использую веб-интерфейс drf:

enter image description here

1 Ответ

0 голосов
/ 25 января 2019

Я решил эту проблему, переопределив метод create и сделав изображения доступными только для чтения:

class AnimalSerializer(serializers.HyperlinkedModelSerializer):

     images = AnimalImageSerializer(many=True, read_only=True)

     def create(self, validated_data):
         images_data = self.context['request'].FILES
         animal = Animal.objects.create(
             slug=validated_data.get('slug', 'default-slug')
         )
         for image_data in images_data.getlist('file'):
             AnimalImage.objects.create(animal=animal, image=image_data)

     class Meta:
         model = Animal
         lookup_field = 'slug'
         extra_kwargs = {
             {'url': {'lookup_field': 'slug'}
         }
         fields = ('slug', 'images', )

Также убедитесь, что вы удалили JsonParser из ModelViewSet

JSONParser

Убедитесь, что если вы используете Postman, вы используете только тип данных формы body

Также убедитесь, что вы добавили все поля, необходимые для создания вашей модели, Животное

Не добавляйте поле изображений и делайте его доступным только для чтения в сериализаторе

Создайте новое поле и назовите его file и сделайте его типом File вместо Text.

Имя поля должно быть file , потому что вы будете использовать getlist ('file'). Имя должно быть таким же. Это то, что испортило меня.

enter image description here

...