我尝试建立一个餐厅订购系统,当某人订购多种产品时,他/她可以选择所选择产品的数量, 如果所有客户都是匿名的(没有注册选项)
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)
答案 0 :(得分:0)
该form_valid
方法中有很多奇怪的事情,但是错误告诉您具体是什么错误,即您正在使用values_list
获取PK而不是传递整个对象。
其他奇怪的事情是通过在查询集上调用list
然后获取第一个获取所有内容;如果您直接在查询集上调用[0]
,这将转换为LIMIT / OFFSET查询以仅获取单个实例。
此外,您可以直接在-
中使用order_by
来颠倒顺序。
form.instance.order = Ordering.objects.order_by('-pk')[0]