【问题标题】:Django ModelManager not saving the model instance correctlyDjango ModelManager 没有正确保存模型实例
【发布时间】:2021-02-20 01:30:07
【问题描述】:

我正在做一个电子商务项目,但我的 OrderManager() 类没有保存实例(我认为) 当我单击 BOOK 按钮时,我收到此错误,在我的视图中定义

order_amount = order_obj.total * 100
AttributeError: 'NoneType' object has no attribute 'total'

但是当我刷新页面时,错误发生了,order_obj.total * 100 被计算出来,但我的问题是为什么我需要在创建新订单时一次又一次地刷新页面。

这是我的 models.py

class OrderQuerySet(models.query.QuerySet):
    def not_created(self):
        return self.exclude(status='created')


class OrderManager(models.Manager):

    def get_queryset(self):
        return OrderQuerySet(self.model, using=self.db)

    def create_or_get_order(self, product):
        created = None
        obj = None
        qs = self.get_queryset().filter(product=product, active=True, status='created')
        if qs.count() == 1:
            obj = qs.first()
        else:
            self.model.objects.create(product=product)
            created = True
        return obj, created


class Order(models.Model):
    order_id = models.CharField(max_length=120, blank=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    total = models.PositiveIntegerField()
    active = models.BooleanField(default=True)

    objects = OrderManager()

    class Meta:
        ordering = ['-ordered_on', '-updated']

    def __str__(self):
        return self.order_id

    def check_done(self):      # check everything is correct before final checkout
        order_id = self.order_id
        total = self.total
        if order_id and total > 0:
            return True
        return False

    def mark_paid(self):
        if self.check_done():
            self.status = 'paid'
            self.save()
        return self.status


def pre_save_create_order_id(sender, instance, *args, **kwargs):
    if not instance.order_id:
        instance.order_id = unique_order_id_generator(instance)


pre_save.connect(pre_save_create_order_id, sender=Order)


def pre_save_order_total(sender, instance, *args, **kwargs):
    """calculate the product total while clicking on Book Button
    (Still booking is not done you just clicked on Book button)"""

    instance.total = instance.product.price


pre_save.connect(pre_save_order_total, sender=Order)

Views.py

def checkout_home_view(request, *args, **kwargs):
    order_obj = None
    order_amount = None
    order_currency = None
    order_id = None

    slug = kwargs['slug']
    product = Product.objects.get(slug=slug)

    if product is not None:

       # ****************** Here is problem ******************************
        order_obj, order_create = Order.objects.create_or_get_order(product)
        ''' HERE I AM GETTING order_obj as None BUT WHEN I REFRESH ERROR GOES WAY '''
        print('order_obj', order_obj)  # printing None initally   
        order_amount = order_obj.total * 100


        order_currency = 'INR'
        order_id = order_obj.order_id
    if request.method == 'POST':
        'check that booking is done'
        is_prepared = order_obj.check_done()  # check_done() defined in Order model
        if is_prepared:
            client = razorpay.Client(auth=("xxx", "xxx"))
            payment = client.order.create(dict(amount=order_amount, currency=order_currency))

            if payment:
                order_obj.mark_paid()  # mark_paid() defined in Order model
                order_obj.save()

【问题讨论】:

  • 问题看起来像 OrderManager else 条件,因为您在返回 return obj, created 之前没有将 self.model.objects.create(product=product) 分配给 obj 变量

标签: python-3.x django django-models django-rest-framework django-views


【解决方案1】:
class OrderManager(models.Manager):
   ...

    def create_or_get_order(self, product):
        created = None
        obj = None
        qs = self.get_queryset().filter(product=product, active=True, status='created')
        if qs.count() == 1:
            obj = qs.first()
        else:
            # -------------- catch the returned obj and return --------------
            obj = self.model.objects.create(product=product)
            created = True
        return obj, created

【讨论】:

    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2015-02-27
    相关资源
    最近更新 更多