【问题标题】:update_or_create with Django for sum old rowupdate_or_create 与 Django 求和旧行
【发布时间】:2018-10-03 00:16:09
【问题描述】:

我正在尝试在 DATABASE 中创建一行,如果存在,则使用 DJANGO 将旧值更新为新 + 旧值。类似于上面的 PHP:

$sql= "IF EXISTS(SELECT * FROM April_sales WHERE label='".$product."') THEN
            BEGIN
            UPDATE francais SET sold=sold+'".$sold."'  WHERE label='".$product."';
            END;
            ELSE
            BEGIN
            INSERT INTO April_sales (sold,sold) VALUES('".$sold."','".$product."');
            END;
            END IF;";

我正在接收新行,试试这个:

query = April_sales.objects.get_or_create(product=product, sold= new_amount, date= timezone.now())
sum_value = query.sold + new_amount
query = April_sales(product=product, sold=sum_value , date=timezone.now()) 
query.save()

【问题讨论】:

  • 该代码无法运行。 sum_value = query.n+= new_value 是语法错误。

标签: django sqlite django-models django-queryset


【解决方案1】:

get_or_create 的 django 总是返回一个元组,你需要两个变量来捕捉你想要的:

试试这个:

query, created = April_sales.objects.get_or_create(product=product)
if created:
    query.sold = new_amount
else:
    query.sold += new_amount
query.date = timezone.now()
query.save()

【讨论】:

  • 这样看起来更好,只需在代码中添加一行以在 if 语句中添加日期
  • 其实,日期就是创建与否,我们将timezone.now()添加到实例中
【解决方案2】:

我找到了以下解决方案,它不漂亮而且有点长: 如果有人有更好的建议,请随时改进。

try:
    query = April_sales.objects.get(product=product)
    query.sold = query.sold + new_amount
    query.date = timezone.now()
    query.save()
except April_sales.DoesNotExist:
    query = April_sales(product=product, sold=new_amount, date=timezone.now())
    query.save()

【讨论】:

    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2021-05-09
    • 2018-08-15
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多