TypeError: create () принимает 1 позиционный аргумент, но было дано 2; Django REST Framework - PullRequest
0 голосов
/ 28 мая 2020

У меня возникла проблема при попытке создать экземпляр модели из десериализованных / проверенных данных. Как показано, ошибка TypeError возникает, когда реализация self.create() вызывается в пределах Serializer.save(). Я не могу понять, какой второй аргумент вызывает ошибку. Вот аргумент validated_data, переданный функции ...

{'gender': {'MALE'}, 'size': {'LARGE', 'MEDIUM'}, 'age': {'ADULT', 'BABY'}, 'user': <User: Mock>}

File "C:\...\rest_framework\serializers.py", line 191, in save
    self.instance = self.create(validated_data)
TypeError: create() takes 1 positional argument but 2 were given

tests.py

class TestSetUserPreferences(TestCase):
    '''Verify that an User receives a 201 status code
    when setting preferences on their profile.'''

    @classmethod
    def setUpTestData(cls):
        cls.user = User.objects.create_user(
            username="Mock", password="secret"
        )

        cls.credentials = b64encode(b"Mock:secret").decode("ascii")

        cls.user_settings = json.dumps({
            "gender": ["MALE"],
            "size": ["MEDIUM", "LARGE"],
            "age": ["BABY", "ADULT"]
        })

        cls.factory = APIRequestFactory()

    def test_user_preference_settings_success(self):
        request = self.factory.post(
            reverse("user-pref-settings"),
            data=self.user_settings,
            content_type="application/json",
            headers = {
                'HTTP_AUTHORIZATION': f"Basic {self.credentials}"
            }
        )
        force_authenticate(request, self.user)
        response = SetUserPrefView.as_view()(request)
        self.assertEqual(response.status_code, 201)

views.py


class SetUserPrefView(
    GenericAPIView,
    CreateModelMixin,
    RetrieveModelMixin,
    UpdateModelMixin):

    queryset = UserPref.objects.all()
    serializer_class = UserPreferenceSerializer

    def post(self, *args, **kwargs):
        import pdb; pdb.set_trace()
        self.create(self.request, *args, **kwargs)

    def perform_create(self, serializer):
        return serializer.save(user=self.request.user)

serializers.py

class UserPreferenceSerializer(serializers.Serializer):
    gender = serializers.MultipleChoiceField(choices=USER_PREF_DOG_GENDER)
    size = serializers.MultipleChoiceField(choices=USER_PREF_DOG_SIZE)
    age = serializers.MultipleChoiceField(choices=USER_PREF_DOG_AGE)

    def create(self, **validated_data):
        user = UserPref.objects.create(**validated_data)

1 Ответ

0 голосов
/ 28 мая 2020

Как указывает ошибка, метод create принимает два позиционных параметра, данные не передаются как именованные параметры, но в одном словаре , поэтому вы должны написать это как:

class UserPreferenceSerializer(serializers.Serializer):
    gender = serializers.MultipleChoiceField(choices=USER_PREF_DOG_GENDER)
    size = serializers.MultipleChoiceField(choices=USER_PREF_DOG_SIZE)
    age = serializers.MultipleChoiceField(choices=USER_PREF_DOG_AGE)

    def create(self, <b>validated_data</b>):
        return UserPref.objects.create(**validated_data)
...