python - ErrorDetail(string='期望的项目列表,但得到类型“ReturnDict”。', code='not_a_list')
问题描述
当我测试时ThankYouMessage
出现错误{'images': {'non_field_errors': [ErrorDetail(string='Expected a list of items but got type "ReturnDict".', code='not_a_list')]}}
测试
class ThankYouMessagesSerializerTestCase(MediaTestCase, TestCase):
def setUp(self) -> None:
self.thank_you_message = ThankYouMessageFactory()
self.thank_you_image = ThankYouImageFactory()
def test_thank_you_message_deserialize(self) -> None:
image_data = ThankYouMessageImageSerializer(self.thank_you_image).data
thank_you_data = ({'text': 'Some text', 'images': image_data})
serializer = ThankYouMessagesSerializer(data=thank_you_data)
serializer.is_valid()
print(serializer.errors)
# {'images': {'non_field_errors': [ErrorDetail(string='Expected a list of items but got type "ReturnDict".', code='not_a_list')]}}
self.assertTrue(serializer.is_valid())
楷模
class ThankYouMessage(models.Model):
donation = models.ForeignKey("donation.Donation", on_delete=models.CASCADE, related_name='thank_message', unique=True)
text = models.TextField()
class ThankImage(models.Model):
message = models.ForeignKey("donation.ThankYouMessage", on_delete=models.CASCADE, related_name='images')
image = models.ImageField(upload_to="thankmessageimages/")
工厂
class ThankYouMessageFactory(factory.django.DjangoModelFactory):
class Meta:
model = ThankYouMessage
donation = factory.SubFactory(DonationFactory)
text = factory.Sequence(lambda n: f"Thank you {n}")
When I test При тестировании сериализатора получаю ошибку
class ThankYouImageFactory(factory.django.DjangoModelFactory):
class Meta:
model = ThankImage
image = factory.django.ImageField(name=f"testimage.jpeg", color="blue")
message = factory.SubFactory(ThankYouMessageFactory)
序列化器
class ThankYouMessageImageSerializer(ModelSerializer):
class Meta:
model = ThankImage
fields = '__all__'
read_only_fields = ("message", "id")
class ThankYouMessagesSerializer(ModelSerializer):
images = ThankYouMessageImageSerializer(many=True)
donation = serializers.CharField(source='donation.id', read_only=True)
donor_id = serializers.CharField(source='donation.donor.id', read_only=True)
class Meta:
model = ThankYouMessage
fields = 'text', 'donation', 'donor_id', 'images'
如果我写image_data = ThankYouMessageImageSerializer(self.thank_you_image, many=True).data
我得到TypeError: 'ThankImage' object is not iterable
解决方案
您ThankYouMessage
将有一个相关字段images
作为ThankYouImage
s 的集合,因此您需要您的thank_you_image
作为列表。.build_batch()
您可以使用工厂方法构建它并使用many=True
参数对其进行序列化。
class ThankYouMessagesSerializerTestCase(MediaTestCase, TestCase):
def setUp(self) -> None:
...
self.thank_you_images = ThankYouImageFactory.build_batch(3)
def test_thank_you_message_deserialize(self) -> None:
image_data = ThankYouMessageImageSerializer(self.thank_you_images, many=True).data
...
当我测试它时,您image_data
仍然无法序列化并显示此错误:
提交的数据不是文件。检查表单上的编码类型。
但我认为这是另一个话题
顺便说一句,为什么不直接序列化生成的self.thank_you_message
而不是thank_you_data
? 你想在这里测试什么?
推荐阅读
- firebase - 为什么 Crashlytics 会因未处理的异常进入无限循环?
- java - 为什么我的 Mono 应该被订阅,而另一种情况它运行正常
- java - 为什么集合不能使用时间戳正确排序对象?
- python-3.x - 使用 pycparser 获取枚举/结构的成员
- elasticsearch - 弹性搜索索引经常被删除
- laravel - Foreach 循环未在 Laravel 中运行
- discord.py - 获取踢bot的作者ID
- sql-server - 是否可以构建一个 .net graphql 后端并与 redux 前端反应?
- audio - 如何在ffmpeg中将.aaxc文件转换为mp3?
- powerbi - 如何在 power-bi 中隐藏视觉效果?