一方面,让我们考虑这个Django模型:
from django.db import models
from uuid import UUID
class Entry(models.Model):
id = models.UUIDField(primary_key=True, default=uuid4, editable=False)
value = models.DecimalField(decimal_places=12, max_digits=22)
items = ArrayField(base_field=models.UUIDField(null=False, blank=False), default=list)
另一方面,假设我们有这样一本字典:
coefficients = {item1_uuid: item1_coef, item2_uuid: item2_coef, ... }
Entry.value
旨在根据coefficients
在Entry.items
之间分配。
- 使用Django ORM,给定系数,最有效的方法是什么(在一个SQL查询中)来获得我的
Entries
对于一个Item
的值的总和?**
- 使用Django ORM,给定系数,最有效的方法是什么(在一个SQL查询中)来获得我的
例如,对于下面的item1
,我想得到168.5454...
,也就是说100 * 1 + 150 * (0.2 / (0.2 + 0.35)) + 70 * 0.2
。
| 条目ID|价值|项目|
| - ------|- ------|- ------|
| uuid1|一百|[item1_uuid]
|
| uuid2|一百五十|[item1_uuid, item2_uuid]
|
| uuid3|七十|[item1_uuid, item2_uuid, item3_uuid]
|
coefficients = { item1_uuid: Decimal("0.2"), item2_uuid: Decimal("0.35"), item3_uuid: Decimal("0.45") }
附加问题:我如何调整我的模型以使这个查询运行得更快?我特意选择使用ArrayField
,而决定不使用ManyToManyField
,这是个坏主意吗?如何知道在哪里可以为这个特定的查询添加db_index[es]
?
我使用的是Python 3.10、Django 4.1和Postgres 14。
1条答案
按热度按时间ulydmbyx1#
我已经找到了一个解决我自己的问题的方法,但我相信这里的人可以想出一个更有效和更清洁的方法。
这里的想法是将
.alias()
方法(参见Django文档)和conditional expressions与Case
和When
链接在一个for
循环中。这会导致查询过于复杂,但至少可以按预期工作:
对于我在问题中给出的示例,对于
item1
,此函数的输出是Decimal(168.5454...)
,正如预期的那样。