从Django的模型字段中删除值

时间:2020-08-22 14:09:54

标签: python django

我正在django的基本电子商务网站上工作。我具有以下视图来检查订单是否成功。

def handlerequest(request, id):
    order=Order.objects.get(id=id)
    items=order.orderitem_set.all()
    verify = Checksum.verify_checksum(response_dict, MERCHANT_KEY, checksum)
    if verify:
        if response_dict['RESPCODE'] == '01':
            order.save()
            print('order successful')
        else:
            order.dstatus="Cancelled"
            order.save()
            
            
    return render(request, 'handlerequest.html', {'response': response_dict,'order':order})

这里的物品是指用户选择购买的产品。我的产品型号如下所示(带有尺寸型号)(我已删除了一些字段)

class Siz(models.Model):
    size=models.CharField(max_length=3,null=True,blank=True)

class Product(models.Model):
    name=models.CharField(max_length=10)
    size=models.ManyToManyField(Siz)

我所做的是,在我的siz模型中,我添加了几种尺寸(例如S,L,M),对于产品,我选择了每种产品可用的尺寸。现在我担心的是,每当有人下订单时,在检查订单成功之后,我想删除从产品中订购的商品的尺寸。(例如,如果某人订购了尺寸为L的商品AB我要删除的产品尺寸L) 以下是我的订单项和订单模型供参考。

class Order(models.Model):
    customer=models.ForeignKey(Customer,on_delete=models.SET_NULL,null=True,blank=True)
    complete=models.BooleanField(default=False,null=True,blank=False)


class OrderItem(models.Model):
    product=models.ForeignKey(Product,on_delete=models.SET_NULL,null=True)
    order=models.ForeignKey(Order,on_delete=models.SET_NULL,null=True,)
    size=models.ForeignKey(Siz,on_delete=models.SET_NULL,null=True)

我还想记住,如果用户订购了多个商品,则应该删除所有产品的订购尺寸。我尝试解决此问题,但对我没有任何帮助。因此,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

考虑到OrderItem具有与其相关联的特定Size(外键),我假设单个订单不能包含多个尺寸(因此,它可以具有相同尺寸的多个产品,但是不能多个各种尺寸的产品)。如果是这种情况,我建议您稍微更改一下模型,以便跟踪可用的产品数量:

class Size(models.Model):
    size=models.CharField(max_length=3,null=True,blank=True)

class Product(models.Model):
    name=models.CharField(max_length=10)

class ProductItem(models.Model): # the "warehouse", ie how many we've got available
    product=models.ForeignKey(Product)
    size=models.ForeignKey(Size)
    quantity=models.IntegerField() # how many still available


class Order(models.Model):
    customer=models.ForeignKey(Customer,on_delete=models.SET_NULL,null=True,blank=True)
    complete=models.BooleanField(default=False,null=True,blank=False)


class OrderItem(models.Model):
    product=models.ForeignKey(Product,on_delete=models.SET_NULL,null=True)
    order=models.ForeignKey(Order,on_delete=models.SET_NULL,null=True,)
    size=models.ForeignKey(Size,on_delete=models.SET_NULL,null=True)
    quantity=models.IntegerField() # how many within a single

请注意quantity(已订购的数量)和OrderItem(仍可用的数量)中的ProductItem属性。这样,您可以轻松跟踪剩下的产品数量。

我认为这种many-to-many关系在这种情况下并不正确,因为Size表是某种枚举-假设您要在其中添加10种不同的大小,再也不会碰那个桌子了吧?多对多关系的一个很好的例子是BookAuthor,因为有多个作者撰写的多本书,而且这些对象通常都不是“枚举”或带有有限的“可能值”集。最后,Size本身并不真正属于任何Product,对吧?