Я решил проблему следующим образом:
Переопределить метод to_internal_value
из SlugRelatedField, рассматривая исключение DoNotExist, чтобы не вызвать ошибку.
class CouponSlugRelatedField(serializers.SlugRelatedField):
def to_internal_value(self, code):
try:
return Coupon.objects.only_valid().get(code=code)
except Coupon.DoesNotExist:
return Coupon.objects.none()
class CouponSerializer(serializers.Serializer):
code = CouponSlugRelatedField(
slug_field='code',
required=False,
source='coupon',
allow_null=True,
queryset=Coupon.objects.only_valid()
)
def to_representation(self, coupon):
return {
'code': coupon.code,
'discount_amount': coupon.discount_amount,
'discount_percentage': coupon.discount_percentage,
'only_first_order': coupon.only_first_order,
}