sql - 使用分组在 Django 中有条件地批量更新

标签 sql django postgresql django-models django-orm

假设我有一个具有以下模型定义的交易列表:

class Transaction(models.Model):
    amount = models.FloatField()
    client = models.ForeignKey(Client)
    date = models.DateField()
    description = models.CharField()
    invoice = models.ForeignKey(Invoice, null=True)

现在我想在月底为每个客户创建发票。发票模型如下所示:

class Invoice(models.Model):
    client = models.ForeignKey(Client)
    invoice_date = models.DateField()
    invoice_number = models.CharField(unique=True)

    def amount_due(self):
        return self.transaction_set.aggregate(Sum('amount'))

def create_invoices(invoice_date):
    for client in Client.objects.all():
    transactions = Transaction.objects.filter(client=client)
    if transactions.exists():
        invoice = Invoice(client=client, number=get_invoice_number(), date=invoice_date)
            invoice.save()
            transactions.update(invoice=invoice)

我知道我可以使用批量创建在 1 个查询中使用批量创建来创建所有发票,但我仍然需要在交易模型中单独设置发票字段。

是否可以在创建所有发票后使用单个查询设置所有交易模型的发票字段?最好使用 ORM,但如果需要,也乐于使用原始 SQL。

我知道我也可以在交易列表中使用按客户分组来获取每个客户的总数,但是单个条目不会链接到发票。

最佳答案

你可以尝试构建一个 conditional update query如果您之前能够生成从客户到发票的映射:

from django.db.models import Case, Value, When

# generate this after creating the invoices
client_invoice_mapping = {
    # client: invoice
}

cases = [When(client_id=client.pk, then=Value(invoice.pk)) 
         for client, invoice in client_invoice_mapping.items()]

Transaction.objects.update(invoice_id=Case(*cases))

请注意,条件查询从 Django 1.8 开始可用。否则,您可能会考虑使用原始 SQL 构建类似的东西。

关于sql - 使用分组在 Django 中有条件地批量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54626349/

相关文章:

sql - 如何从 SQL Server 中的 INNER JOIN 查询获取 DISTINCT 行

python - 'csrf_tokan',预期为 'endblock' 。您是否忘记注册或加载此标签?

sql - 选择时间戳大于时区的位置

python - Django - 如何限制哪些用户可以连接到套接字?

python - 导入错误: cannot import name 'OrderDetailView' from 'core.api.views' in Django and ReactJs

sql - Pgsql删除某些列(不是全部)重复的行

arrays - 如何将两个数组的交集结果转换​​为整数数组从SQL查询到postgresql中的整数数组

sql - 基本的 SQL 东西……左连接

sql - 使用SQL命令的SSIS OLEDB目标

sql - 如何更正此 T-SQL 语法以获得没有小数位的输出?