为什么我的验证在django-rest序列化器中不起作用?

xwmevbvl  于 2022-12-30  发布在  Go
关注(0)|答案(1)|浏览(118)

尽管我在开始时间之前提供了预约,但仍在登记预约。

    • 型号. py**
class Appointment(models.Model):
    status = models.CharField(
        choices=APPOINMENT_STATUSES,
        max_length=20,
        default=SCHEDULED,
        help_text="",
    )
    full_name = models.CharField(max_length=100)
    gender = models.CharField(choices=GENDER_TYPE, max_length=10, default=MALE)
    email =  models.EmailField()
    phone_no = models.CharField(max_length=10, validators=[validate_phone_no])
    start = models.DateTimeField(max_length=50, help_text="Appointment start Date & Time")
    end = models.DateTimeField(max_length=50, help_text="Appointment End Date & Time")
    doctor = models.ForeignKey(Doctor, on_delete=models.PROTECT, blank=True, null=True) 
    message = models.TextField()

    def __str__(self):
        return self.full_name
    • 序列化程序. py**
class AppointmentCreateSerializer(serializers.ModelSerializer):
    class Meta: 
        model = Appointment
        fields = '__all__'
 

    def create(self, validated_data):
        return super().create(validated_data)

    def validate(self, attrs):
        # check appointment start and end time

        if attrs["start"] < timezone.now():
            raise serializers.ValidationError("Appointment date cannot be in the past")

        if attrs["start"] >= attrs["end"]:
            raise serializers.ValidationError(
                f"Appointment end date/time should be after than start/date time."
            )
        return super().validate(attrs)
    • 说明:**

这是我的约会模型和序列化器。为什么我的验证不起作用。
我想,用户将无法创建约会,如果 * 开始 * 日期和时间是在当前日期和时间之前。---------------〉但约会正在注册,如果用户输入今天的日期,但之前的时间。

  • 这有什么错?什么可以更好地解决这个问题?*
omhiaaxx

omhiaaxx1#

我认为您的验证工作正常。您没有看到它的原因可能是时区。假设您在设置中有timezone =“UTC”,现在是当地时间18:00和UTC标准时间11:00(相差7小时)。如果您在请求中发送“start”而没有时区指示,例如2022-12- 27 T17:00,那么服务器将认为是UTC标准时间17:00,因此17:00晚于11:00。
我尝试发送开始日期与指示的小时数从utc和看看它是否工作。在我的例子中,它将是2022-12- 27 T17:00:00+07:00,所以服务器应该将它转换为10:00在utc(或其他时区,您正在使用的设置)什么是早于11:00

相关问题