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
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