كيفية تجاهل الخطأ بدلاً من إرجاع 400 طلب غير صالح؟ - Django Rest Framework

-1

لدي نموذج اسمه Cart. سلة الشراء بها مفتاح خارجي للقسيمة.

عندما أقوم بإنشاء عربة جديدة ، يتم تشغيل بعض عمليات التحقق لمعرفة ما إذا كانت القسيمة موجودة. إذا لم يكن كذلك ، فإنها ترجع الخطأ 400 قائلة أن الكائن غير موجود. لا أريد خطأ 400 ، أحتاج إليه لمتابعة العمليات التي تعيد القسيمة كـ Null.

serializers.py

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,
    )
    totals = serializers.SerializerMethodField()


class CouponSerializer(serializers.Serializer):
    code = serializers.SlugRelatedField(
        slug_field='code',
        required=False,
        source='coupon',
        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,
        }

views.py

class CartViewset(CreateModelMixin, GenericViewSet):
    queryset = Cart.objects.all()
    serializer_class = CartSerializer
    permission_classes = (AllowAny,)

3 الاجابة

0

حللت المشكلة على النحو التالي:

تجاوز to_internal_value طريقة من SlugRelatedField ، ومعالجة استثناء DoesNotExist لعدم رفع الخطأ.

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,
        }
:مؤلف
0

تحتاج إلى إضافة فارغة = صحيح لنموذجك لأنه قسيمة ForeignKey = models.ForeignKey('carts.Coupon',related_name='carts',on_delete=models.SET_NULL, null=True, blank=True )

هنا هو جيد آخر عن الفرق من لاغية وفارغة على نماذج

:مؤلف
0

وفقًا لمستندات إطار Django REST ، تحتاج إلى تعيين 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 النموذج كذلك.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام