ErrorDetail (string = 'Ожидается список элементов, но получен тип "ReturnDict".', Code = 'not_a_list') - PullRequest
0 голосов
/ 29 января 2020

Когда я тестирую 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

1 Ответ

0 голосов
/ 30 января 2020

Ваш ThankYouMessage будет иметь связанное поле images, которое будет действовать как совокупность ThankYouImage с, поэтому вам потребуется 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 все еще не может быть сериализован и показывает эту ошибку:

Представленные данные не были файлом. Проверьте тип кодировки в форме.

Но я думаю, что это для другой топи c


Кстати, почему бы не сериализовать напрямую сгенерированный self.thank_you_message вместо thank_you_data? Что вы пытаетесь проверить здесь?

...