Почему мой тест сериализатора выдает ошибку «TypeError: 'ReturnDict' object is not callable»? - PullRequest
0 голосов
/ 25 мая 2020

Я использую Django 2.2, Python 3.7, структуру Django rest и pytest. Я хочу написать модульный тест, чтобы увидеть, может ли мой сериализатор создать мою модель. Мой тест выглядит так ...

@pytest.mark.django_db
def test_coop_create(self):
    """ Test coop serizlizer model """
    state = StateFactory()
    serializer_data = {
        "name": "Test 8899",
        "types": [
            {"name": "Library"}
        ],
        "address": {
            "formatted": "222 W. Merchandise Mart Plaza, Suite 1212",
            "locality": {
                "name": "Chicago",
                "postal_code": "60654",
                "state_id": state.id
            }
        },
        "enabled": "true",
        "phone": "7739441426",
        "email": "myemail",
        "web_site": "http://www.1871.com/"
    }

    serializer = CoopSerializer(data=serializer_data)
    serializer.is_valid()
    print(serializer.errors())
    assert serializer.is_valid(), serializer.errors()
    result = serializer.save()
    print(result)

Однако «serializer.errors ()» производит вывод

TypeError: 'ReturnDict' object is not callable

Я не понимаю, почему и как отлаживать дальше. Код моего сериализатора -

class CoopSerializer(serializers.ModelSerializer):
    types = CoopTypeSerializer(many=True)
    address = AddressTypeField()

    class Meta:
        model = Coop
        fields = ['id', 'name', 'types', 'address', 'phone', 'enabled', 'email', 'web_site']
        extra_kwargs = {
            'phone': {
                'required': False,
                'allow_blank': True
            }
        }

    def to_representation(self, instance):
        rep = super().to_representation(instance)
        rep['types'] = CoopTypeSerializer(instance.types.all(), many=True).data
        rep['address'] = AddressSerializer(instance.address).data
        return rep

    def create(self, validated_data):
        #"""
        #Create and return a new `Snippet` instance, given the validated data.
        #"""

        coop_types = validated_data.pop('types', {})
        instance = super().create(validated_data)
        for item in coop_types:
            coop_type, _ = CoopType.objects.get_or_create(name=item['name'])  #**item)
            instance.types.add(coop_type)

        return instance

, а код базовой модели - ...

class Coop(models.Model):
    objects = CoopManager()
    name = models.CharField(max_length=250, null=False)
    types = models.ManyToManyField(CoopType)
    address = AddressField(on_delete=models.CASCADE)
    enabled = models.BooleanField(default=True, null=False)
    phone = PhoneNumberField(null=True)
    email = models.EmailField(null=True)
    web_site = models.TextField()

Вот ссылка на GitHub, если вы действительно хотите сходить с ума - https://github.com/chicommons/maps/tree/master/web.

1 Ответ

1 голос
/ 25 мая 2020

Должно быть serializer.errors вместо serializer.errors()

.errors - это property, а не метод :)

...