类型错误: create() 需要 1 个位置参数,但给出了 2 个;Django REST Framework



尝试从反序列化/验证的数据创建模型实例时遇到问题。 如图所示,当在Serializer.save()内调用self.create()的实现时,会引发TypeError。我无法弄清楚导致错误的第二个参数是什么。这是传递给函数的validated_data参数...

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

File "C:...rest_frameworkserializers.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)

正如错误所示,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,validated_data):
return UserPref.objects.create(**validated_data)

最新更新