Try, Except 没有在 django 序列化程序创建方法中给出所需的结果。如果 put 在 try 之外,则 getobject 语句会给出所需的结果:

Try, Except is not giving required result in django serializers create method. the getobject statements gives required result if put is outside try:

class BeneficiarySerializer(serializers.Serializer):
    class Meta:
        model = Beneficiary
        fields ='__all__'

    def create(self, validated_data):
        try:
            available = Beneficiary.objects.get(coupon_code=validated_data['coupan_code'])
            raise serializers.ValidationError("The provided coupon code is already utilized")
        except:
            return super().create(validated_data)


class Coupon(models.Model):
    sl_no = models.CharField(max_length=50, primary_key=True)
    c_code = models.CharField(max_length=50, blank=True)

    def __str__(self):
        return self.c_code


class Beneficiary(models.Model):
    name = models.CharField(max_length=50)
    coupon_code = models.ForeignKey(Coupon, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

目的是只向一个人发放优惠券,如果将相同的优惠券代码发放给另一个人,在这种情况下,序列化程序应该提出并错误提示密钥已发放给某人。 如果我把代码放在 try 中,除了每次验证失败时,相同的优惠券代码会分配给很多人,如果在 try 之外使用 objects.get:找到语句是 return 结果。如果我没有使用 try: except 以正确的方式或任何其他方式来处理这种情况,请告诉我

问题在于,无论该代码将引发什么异常,对 super 的调用都将以任何方式发生。如果您的查询没有匹配的 Beneficiary,则 get 方法将引发 DoesNotExist 异常,如果您自己引发了异常。你立即抓住他们并打电话给 super.

更进一步,为了这个简单的目的,您甚至不需要异常,您也不应该在 create 方法中执行此验证!你应该在那里写一个 validate_<field> method and make an exists query:

class BeneficiarySerializer(serializers.Serializer):
    class Meta:
        model = Beneficiary
        fields ='__all__'
    
    def validate_coupon_code(self, value):
        if Beneficiary.objects.filter(coupon_code=value).exists():
            raise serializers.ValidationError("The provided coupon code is already utilized")
        return value