So, I'm building an API with Django and rest-framework and when I try to send a post test request it keep getting this error where it's expecting a number but got a OrderedDict, if someone could help me it would be great.
test_api.py
def setUp(self):
self.client = APIClient()
self.sensor = Sensor(54545)
self.sensor.save()
self.company = Company(name='MOCK')
self.company.save()
def test_create_valid_user_success(self):
"""Test creating a user with valid payload is successful"""
payload = {
'email': 'test@gmail.com',
'password': 'pass123',
'name': 'Test',
'registration': 144545,
'sensor': {
'id': 455465,
'battery': 100
},
'company': self.company.id
}
res = self.client.post(CREATE_USER_URL, payload, format='json')
self.assertEqual(res.status_code, status.HTTP_201_CREATED)
user = get_user_model().objects.get(**res.data)
self.assertTrue(user.check_password(payload['password']))
self.assertNotIn('password', res.data)
self.assertNotIn('id', res.data)
*already tried json.dumps(payload), content_type='application/json' for the post
serializers.py
class SensorSerializer(serializers.ModelSerializer):
class Meta:
model = Sensor
fields = ('id', 'battery',)
class UserSerializer(serializers.ModelSerializer): """Serializer for the user object""" sensor = SensorSerializer()
class Meta:
model = get_user_model()
fields = (
'email',
'password',
'name',
'registration',
'sensor',
'company',
)
extra_kwargs = {
'password': {'write_only': True, 'min_length': 5},
'id': {'write_only': True}
}
def create(self, validated_data):
"""Create a new user with encrypt password and return it"""
sensor_data = validated_data.pop('sensor')
sensor = SensorSerializer.create(SensorSerializer(), validated_data=sensor_data)
return get_user_model().objects.create_user(sensor=sensor, **validated_data)
views.py
class CreateUserView(generics.CreateAPIView):
"""Create a new user in the system view"""
serializer_class = UserSerializer
Error:
TypeError: Field 'id' expected a number but got OrderedDict([('id', 455465), ('battery', 100)].
Aucun commentaire:
Enregistrer un commentaire