Python 在DRF中支持JSON和文件多部分上传的测试
我想为我的应用程序编写一个测试,使用多部分发布json和文件 这是我到目前为止尝试过的,但是Python 在DRF中支持JSON和文件多部分上传的测试,python,django,python-3.x,django-rest-framework,Python,Django,Python 3.x,Django Rest Framework,我想为我的应用程序编写一个测试,使用多部分发布json和文件 这是我到目前为止尝试过的,但是集合\u项(在创建方法中)为空。我是否需要修改我的视图以使其正确工作,或者我是否在下面的测试用例中做了一些不正确的事情 我的测试: image = Image.new('RGB', (100, 100)) tmp_file = tempfile.NamedTemporaryFile(suffix='.jpg') image.save(tmp_file) files = {
集合\u项(在创建方法中)为空。我是否需要修改我的视图以使其正确工作,或者我是否在下面的测试用例中做了一些不正确的事情
我的测试:
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
这是模型:
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
序列化程序:
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
我使用的是Django Rest Framework 3.x、Django 1.8.x和Python 3.4.x
更新
我已经试过了,但还是没有乐趣<代码>集合\u项目
在我的创建中为空。这要么与它是嵌套对象的事实有关,要么与我的视图中发生的事情有关
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}],
})
错误
我明白了
{'image': <SimpleUploadedFile: temp.jpeg (text/plain)>}
{'image':}
使用多部分解析器,您只需在post参数中传递文件处理程序(请参阅)。在您的代码中,您提交了一个json编码的部分作为数据有效负载,并在files
参数中提交了文件部分,我认为它不能以这种方式工作
请尝试以下代码:
from PIL import Image
from io import BytesIO
from django.core.files.uploadedfile import SimpleUploadedFile
stream = BytesIO()
image = Image.new('RGB', (100, 100))
image.save(stream, format='jpeg')
uploaded_file = SimpleUploadedFile("file.jpg", stream.getvalue(), content_type="image/jpg")
payload = {
"title": "Test collection",
"collection_items": [{"image": uf}],
}
self.api_factory.credentials(Authorization='Bearer ' + self.token)
self.api_factory.post(url, data=payload, format='multipart')
...
我不完全确定嵌套序列化是否有效,但至少文件上传应该有效。您好,我已经根据这个答案更新了我的OP,但它仍然是空的!:(请注意,字段映像在ItemCollectionDetailSerializer中设置为只读。无论如何,我建议您使用pdb逐步检查序列化程序验证方法,以找出问题所在。