Тест для поддержки как JSON, так и многопартийных загрузок файлов в DRF

я хотел бы написать тест для моего DRF приложение, которое публикует как json, так и файл с помощью multipart.

это то, что я пытался до сих пор, но collection_items (в методе create) пусто. Мне нужно изменить мое представление, чтобы сделать эту работу правильно, или я делаю что-то неправильно в моем тестовом примере ниже?

Мой Тест:

    image = Image.new('RGB', (100, 100))
    tmp_file = tempfile.NamedTemporaryFile(suffix='.jpg')
    image.save(tmp_file)

    files = {"collection_items": [{"image": tmp_file}]}
    payload = json.dumps({
        "title": "Test Collection",
    })

    self.api_factory.credentials(Authorization='Bearer ' + self.token)
    response = self.api_factory.post(url, data=payload, files=files, format='multipart')

это модель:

class Collection(models.Model):

    title = models.CharField(max_length=60)
    collection_items = models.ManyToManyField('collection.Item')


class Item(models.Model):
    image = models.ImageField(upload_to="/",null=True, blank=True)

сериализаторы:

class ItemCollectionDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('id', 'image')
        read_only_fields = ('image',)


class CollectionListSerializer(serializers.ModelSerializer):

    url = serializers.HyperlinkedIdentityField(view_name='col_detail')
    collection_items = ItemCollectionDetailSerializer(many=True, required=True)

    class Meta:
        model = Collection
        fields = ('url', 'id', 'collection_items')

    def create(self, validated_data):

        item_data = validated_data.pop('collection_items')

        print(item_data)  # <----- **EMPTY HERE???**

        etc ....edited for brevity

так print(item_data) пусто [], почему? Как мне решить эту проблему?

это весь мой вид: ниже, мне нужно что-то сделать здесь?

class CollectionListView(generics.ListCreateAPIView):

    queryset = Collection.objects.all()
    serializer_class = CollectionListSerializer

я использую Django Rest Framework 3.x, Django 1.8.x и Python 3.4.x.

обновление

я пробовал ниже, но до сих пор нет радости! collection_items пусто в мой create. Это связано с тем, что это вложенный объект или что-то должно произойти, на мой взгляд.

    stream = BytesIO()
    image = Image.new('RGB', (100, 100))
    image.save(stream, format='jpeg')
    uploaded_file = SimpleUploadedFile("temp.jpeg", stream.getvalue())

    payload = {
        "title": "Test Collection",
        "collection_items": [{"image": uploaded_file}],
    }

    self.api_factory.credentials(Authorization='Bearer ' + self.test_access.token)
    response = self.api_factory.post(url, data=payload, format='multipart')

обновление 2

если я изменю свою полезную нагрузку на использование json.dumps кажется, теперь вижу файл, но конечно это не может работать!

payload = json.dumps({
            "title": "Test Collection",
            "collection_items": [{"image": uploaded_file}],
        })

<SimpleUploadedFile: temp.jpeg (text/plain)> is not JSON serializable

PS

я знаю, что файл загружается, потому что если я сделаю следующее В моем сериализаторе...

print(self.context.get("request").data['collection_items'])

я вам

{'image': <SimpleUploadedFile: temp.jpeg (text/plain)>}

1 ответов


используя многопартийный парсер, вы можете просто передать обработчик файла в аргументах post (см. этой). В вашем коде вы отправляете часть, закодированную в json, как полезную нагрузку данных и часть файла в