【问题标题】:how to provide default value to a foreign while creating a new instance如何在创建新实例时向外部提供默认值
【发布时间】:2019-11-27 15:55:19
【问题描述】:

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

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)

【问题讨论】:

  • 第一步是纠正缩进。

标签: python django model


【解决方案1】:

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

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

另外,您可以在order_by 中直接使用- 来反转顺序。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2017-05-17
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多