DJANGO-REST测试:1)在测试串行器时无法分配外键值(2)Interger字段接受浮点值

发布于 2025-02-03 16:15:02 字数 3313 浏览 3 评论 0 原文

上下文:我正在编写用于测试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')]} 

我的问题:

  1. 为什么我会因 w2_deser.is_valid()而false false?
  2. 如何解决后续错误(w2_deser.errors)?我尝试设置user_id = cls.u1.user_id,这也无法解决问题。
  3. 尽管 度假中的字段类被定义为整数,但它接受浮点值。这背后的原因是什么?我该如何解决? (我尝试定义自定义验证器,但没有起作用。)

我已经在互联网上清除了解决方案/信息,并推荐了正式文档。但是,我的问题仍未解决。我是Django和休息的新手。因此,对此事的任何建议将受到欢迎。谢谢。

Context: I am writing the test cases for testing the django model and serializer for a django-rest api.

Models.py looks like this:

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 looks like this:

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 looks like this:

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')]} 

My Questions:

  1. Why do I get False for w2_deser.is_valid() ?
  2. How do I resolve the subsequent error (w2_deser.errors)? I tried setting user_id=cls.u1.user_id, this too did not address the issue.
  3. Although the times field in the Vacation class is defined as an Integer, it accepts the floating point value. What is the reason behind this and how do I address it? (I tried defining custom validators but it did not work.)

I have done my fair bit of scavenging the internet for solution/information and also referred the official documentation. However, my questions remain unresolved. I am fairly new to Django and Rest. So any advice on the matter will be gladly welcomed. Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文