Django使用其他表的查询更新字段

时间:2018-08-10 07:07:45

标签: django django-queryset

我有以下四个模型:

class Item(models.Model):
    name = models.CharField(max_length=20)

class BranchItem(models.Model):
    branch = models.PositiveIntegerField()
    item = models.ForeignKey(Item,
                             blank=False,
                             null=False)

class TaxItem(models.Model):
    item = models.ForeignKey(Item, blank=False, null=False)
    tax = models.ForeginKey(Tax, blank=False, null=False)
    tax_type = models.CharField(max_length=2,
                                blank=True,
                                default='PE')
    amount = models.FloatField(default=9, blank=True)

class SellItem(models.Model):
    amount = models.FloatField(blank=True, default=0.0)
    branch_item = models.ForeignKey(BranchItem, blank=Flase, null=False)
    tax = model.ForeignKey(TaxItem, blank=False, null=False)

现在,我想用必须从SellItem表中获得的适当税费来更新所有TaxItemSellItem表很大,我不想在python中明智地更新每一行,它必须完全在数据库端完成。

我遇到的主要问题是我上面所说的,但是作为解决方案,我选择了使用Subquery的更新方法,如下面的代码所示:

tax_query = TaxItem.objects.filter(item_id=OuterRef('item')).values_list('id')

try:
 SellItem.objects.annotate(item=F('branch_item__item')).update(tax_id=Subquery(tax_query[:1]))
finally:
    connection.queries

它会生成如下所示的疯狂查询:

UPDATE "api_sellitem" SET "tax_id" = (
 SELECT
 U0."id"
 FROM
 "api_taxitem" U0
 WHERE
 U0."item_id" = ("api_branchitem"."item_id")
 LIMIT
 1)
 WHERE
 "api_sellitem"."id" IN (
 SELECT
 V0."id" AS Col1
 FROM
 "api_sellitem" V0
 INNER JOIN
 "api_branchitem" V1 ON (V0."branch_item_id" = V1."id"))

显然是错误的,我不知道该如何纠正?

我正在使用django 1.11.3和postgresql作为数据库,请给我一个解决主要问题的建议,即使用另一个表中的查询来更新表,或者解决第二个问题,即我在同时使用update和subquery方法时遇到的问题

0 个答案:

没有答案