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


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:语句is return result被找到。请让我知道,如果我没有使用尝试:除非以适当的方式或任何其他方式来处理这种情况

问题是,无论代码将引发什么异常,对super的调用都将以任何方式发生。如果您的查询没有匹配的Beneficiary,则get方法将引发DoesNotExist异常,如果您自己引发了异常。立即抓住他们,并致电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

最新更新