Поскольку window.event
не существует в Firefox. Это потому, что браузер имеет разные модели событий, и вам придется иметь дело с их различиями или использовать библиотеку, такую как jQuery, чтобы не иметь дело со всеми различиями между браузерами. Добро пожаловать в DOM.
Я решил проблему следующим образом:
Переопределить метод 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,
}
Согласно Django REST Framework docs , вам нужно установить allow_null=True
в соответствующем поле в вашем сериализаторе:
class CartSerializer(serializers.ModelSerializer):
id = serializers.UUIDField(format='hex', read_only=True)
delivery = DeliverySerializer(required=False, write_only=True)
customer = CustomerSerializer(required=False, write_only=True)
coupon = CouponSerializer(
required=False,
allow_null=True,
)
totals = serializers.SerializerMethodField()
Обратите внимание, что вам понадобится null=True
в вашей Cart
модели.
Вам нужно добавить blank = True в вашу модель, так как это купон ForeignKey = models.ForeignKey('carts.Coupon',related_name='carts',on_delete=models.SET_NULL, null=True, blank=True )
. Хорошая сообщение о разнице нулей и пробелов на модели