我有以下四个模型:
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
表中获得的适当税费来更新所有TaxItem
,SellItem
表很大,我不想在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方法时遇到的问题