如何在创建新实例时向外部提供默认值

时间:2019-07-18 16:38:23

标签: python django model

我尝试建立一个餐厅订购系统,当某人订购多种产品时,他/她可以选择所选择产品的数量, 如果所有客户都是匿名的(没有注册选项)

sql中的子查询

我想提供默认值,而不是手动选择

但我收到此错误

ValueError at /orders-product/
Cannot assign "4": "ProductOrder.order" must be a "Ordering" instance.

有没有解决方案,或者如果有人知道更好的解决方案,我会感激

models.py

class Product(models.Model):
    name = models.CharField(max_length=50)
    price = models.PositiveIntegerField(default=1)

    def __str__(self):
        return self.name


class Ordering(models.Model):
    id = models.AutoField(primary_key = True)
    products = models.ManyToManyField(Product,through='ProductOrder')

    @property
    def total(self):
        return self.productorder_set.aggregate(
            price_sum=Sum(F('quantity') * F('product__price'), output_field=IntegerField()) )['price_sum'] 


class ProductOrder(models.Model):

    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    order = models.ForeignKey(Ordering, on_delete=models.CASCADE,blank=True)
    quantity = models.IntegerField(default=1)

def create_order(sender, instance, **kwargs):
    instance.ordering.save()
    #for create new instance from ordering model

pre_save.connect(create_order,sender=ProductOrder)  

views.py

class ProductOrderCreate(CreateView):
    form_class = ProductOrdering
    model = ProductOrder
    template_name = 'create_product_order.html'
    success_url = '/'

    def form_valid(self,form):
        form.instance.order = list(Ordering.objects.values_list('pk' , flat=True).reverse().order_by('pk'))[0]
        return super(ProductOrderCreate,self).form_valid(form)

1 个答案:

答案 0 :(得分:0)

form_valid方法中有很多奇怪的事情,但是错误告诉您具体是什么错误,即您正在使用values_list获取PK而不是传递整个对象。

其他奇怪的事情是通过在查询集上调用list然后获取第一个获取所有内容;如果您直接在查询集上调用[0],这将转换为LIMIT / OFFSET查询以仅获取单个实例。

此外,您可以直接在-中使用order_by来颠倒顺序。

form.instance.order = Ordering.objects.order_by('-pk')[0]