DJANGO-REST测试:1)在测试串行器时无法分配外键值(2)Interger字段接受浮点值
上下文:我正在编写用于测试DJANGO模型和Django-Rest API的序列化器的测试用例。
Models.py看起来像这样:
from django.db import models
import uuid
class User(models.Model):
user_id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4)
first_name = models.CharField(max_length=100)
second_name = models.CharField(max_length=100)
def getuuid(self):
return str(self.user_id)
class Workout(models.Model):
user_id = models.ForeignKey(User, on_delete=models.DO_NOTHING, null=False, blank=False, default=None, db_column='user_id')
hours = models.FloatField()
class Meta:
constraints = [
models.CheckConstraint(
check=models.Q(hours__gte=0),
name="Hours should be positive"
)
]
class Vacation(models.Model):
user_id = models.ForeignKey(User, on_delete=models.DO_NOTHING, null=False, blank=False, default=None, db_column='user_id')
times = models.IntegerField()
class Meta:
constraints = [
models.CheckConstraint(
check=models.Q(times__gte=1) & models.Q(times__lte=15),
name="Valid range is 1 to 15 inclusive"
)
]
serializer.py看起来像这样:
from rest_framework import serializers
from .models import User, Workout, Vacation
class UserSerializer(serializers.ModelSerializer):
class Meta:
model= User
fields= '__all__'
class WorkoutSerializer(serializers.ModelSerializer):
class Meta:
model= Workout
fields= '__all__'
class VacationSerializer(serializers.ModelSerializer):
class Meta:
model= Vacation
fields= '__all__'
tests.py看起来像这样:
from django.test import TestCase
from .models import *
from .serializers import *
class UserTest(TestCase):
@classmethod
def setUpTestData(cls):
super(UserTest, cls).setUpTestData()
cls.u1 = User.objects.create(
first_name = "Jack",
second_name = "Mueller",
#hours = 3.5,
#times = 3
)
cls.w1 = Workout.objects.create(
hours = 2,
user_id = cls.u1
)
cls.t1 = Vacation.objects.create(
times = 2.5,
user_id = cls.u1
)
cls.w2_val = {
"hours":6,
"user_id": cls.u1
}
cls.w2 = Workout.objects.create(**cls.w2_val)
cls.w2_ser = WorkoutSerializer(cls.w2)
cls.w2_deser = WorkoutSerializer(data=cls.w2_val)
def test_user_model(self):
self.assertEquals(len(User.objects.all()), 1)
def test_serializer(self):
print(self.w2_deser.is_valid()) # return False
print(self.w2_deser.errors) # {'user_id': [ErrorDetail(string='“User object (3a598312-5f3d-4adb-b4fc-c415fb024e8a)” is not a valid UUID.', code='invalid')]}
我的问题:
- 为什么我会因 w2_deser.is_valid()而false false?
- 如何解决后续错误(w2_deser.errors)?我尝试设置user_id = cls.u1.user_id,这也无法解决问题。
- 尽管 度假中的字段类被定义为整数,但它接受浮点值。这背后的原因是什么?我该如何解决? (我尝试定义自定义验证器,但没有起作用。)
我已经在互联网上清除了解决方案/信息,并推荐了正式文档。但是,我的问题仍未解决。我是Django和休息的新手。因此,对此事的任何建议将受到欢迎。谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论