Как работать со свойством модели в представлении django

Я пытаюсь сделать приложение для электронной коммерции, в котором я должен добавить код купона на странице оформления заказа. У меня есть свойство модели для проверки валидности кода купона. Вот мой код

модель:

class CoupenCode(models.Model):
code=models.CharField(max_length=100)
startdate=models.DateField()
enddate=models.DateField()
discount=models.IntegerField()
disc_type=models.CharField(max_length=20,choices=(
    ('Amount','Amount'),
    ('Percentage','Percentage')))
usercount=models.PositiveIntegerField()
min_amount=models.PositiveIntegerField()

@property
def is_expired(self):
    if datetime.now().date() > self.enddate or datetime.now().date() < self.startdate :
        return False
    return True

class Meta:
    db_table = 'CoupenCode'
    ordering = ['-id']

def __str__(self):
    return self.code

просмотров:

def fncoupon(request):
if request.method=="POST":
    coupon=request.POST.get('promo')
    couponcode=CoupenCode.objects.filter(code=coupon)
    validity=couponcode.is_expired()
    if validity == True :
        if couponcode.disc_type == "Amount":
            discount=couponcode.discount + 'Rs'
        else:
            discount=couponcode.discount + '%'
        print(discount)
        return JsonResponse({'discount':discount})

    else:
        message="This coupon code is not valid"

    print(message)
    return JsonResponse({'message':message})

проблема в том, что я не могу проверить действительность кода купона, используя это свойство в представлениях. оно выдает мне ошибку

'QuerySet' object has no attribute 'is_expired'

Может ли кто-нибудь подсказать мне, как я могу решить эту проблему.

Вы используете .filter(…), но это вернет QuerySet, а значит коллекцию из CouponCode. Вы должны использовать .get(…) или еще лучше: get_object_or_404(…):

from django.shortcuts import get_object_or_404

def fncoupon(request):
    if request.method == 'POST':
        couponcode = get_object_or_404(CoupenCode, code=request.POST.get('promo'))
        if not couponcode.is_expired:
            if couponcode.disc_type == "Amount":
                discount=couponcode.discount + 'Rs'
            else:
                discount=couponcode.discount + '%'
            return JsonResponse({'discount':discount})
        else:
            message='This coupon code is not valid'
        return JsonResponse({'message':message})

Однако не имеет особого смысла делать это через POST запрос: POST запрос обычно используется для выполнения боковых эффектов, тогда как GET используется для получения данных, здесь GET запрос кажется более подходящим.

Вернуться на верх