2
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 中,除非每次验证失败,相同的优惠券代码被分配给许多人,如果使用 objects.get outside try: 语句是找到返回结果。如果我没有使用 try: 除非以适当的方式或任何其他方式来处理这种情况,请告诉我

4

1 回答 1

0

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

更进一步,您甚至不需要出于这个简单目的的异常,您也不应该在create方法中执行此验证!您应该编写一个validate_<field>方法并在那里进行exists查询

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
于 2021-07-16T11:28:36.333 回答