我试图找出添加带注释字段的最佳方法,例如任何聚合(计算)字段到DRF(模型)序列化程序.我的用例只是一种情况,即端点返回未存储在数据库中但是从数据库计算的字段.
我们来看下面的例子:
models.py
class IceCreamCompany(models.Model):
name = models.CharField(primary_key = True, max_length = 255)
class IceCreamTruck(models.Model):
company = models.ForeignKey('IceCreamCompany', related_name='trucks')
capacity = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
serializers.py
class IceCreamCompanySerializer(serializers.ModelSerializer):
class Meta:
model = IceCreamCompany
Run Code Online (Sandbox Code Playgroud)
所需的JSON输出:
[
{
"name": "Pete's Ice Cream",
"total_trucks": 20,
"total_capacity": 4000
},
...
]
Run Code Online (Sandbox Code Playgroud)
我有几个解决方案可行,但每个都有一些问题.
选项1:将getter添加到模型并使用SerializerMethodFields
models.py
class IceCreamCompany(models.Model):
name = models.CharField(primary_key=True, max_length=255)
def get_total_trucks(self):
return self.trucks.count()
def get_total_capacity(self):
return self.trucks.aggregate(Sum('capacity'))['capacity__sum']
Run Code Online (Sandbox Code Playgroud)
serializers.py
class IceCreamCompanySerializer(serializers.ModelSerializer):
def get_total_trucks(self, obj):
return obj.get_total_trucks
def get_total_capacity(self, obj):
return obj.get_total_capacity
total_trucks = SerializerMethodField()
total_capacity = SerializerMethodField() …Run Code Online (Sandbox Code Playgroud) 在编写ReactJS时,我必须为动态子项提供密钥.例如:
render() {
const {options} = this.state
const availableOptions = options.map(opt => {
return (
<option key={opt.id} value={opt.id}>{opt.displayValue}</option>}
)
}
return (
<select onChange={this._onOptionSelect}>
{availableOptions}
</select>
)
}
Run Code Online (Sandbox Code Playgroud)
我明白为什么他们的钥匙在那里.但为什么我必须给他们?无法做出反应只是分配一个正在运行的号码或UUIDv4或其他东西?
相关文档:http://facebook.github.io/react/docs/multiple-components.html#dynamic-children
我必须遵循数据库架构:
main_account - username invoice - amount - currency: 'EUR' or 'USD' or 'GBP' - username (main_account has many invoices)
我的目标是以美元列出"最高支付者".因此,我必须从发票表中计算每个用户的"total_paid"总和(并考虑货币转换).我也想通过这个"total_paid"来过滤.
我当前的SQL看起来像:
SELECT main_account.username, total_paid
FROM main_account JOIN
(
SELECT username,
(SELECT SUM(amount) FROM invoice WHERE main_account.username = invoice.username AND invoice.currency = 'EUR') AS total_eur,
(SELECT SUM(amount) FROM invoice WHERE main_account.username = invoice.username AND invoice.currency = 'USD') AS total_usd,
(SELECT SUM(amount) FROM invoice WHERE main_account.username = invoice.username AND invoice.currency = 'GBP') AS total_gbp,
(SELECT (IFNULL(total_usd,0) + 1.12 * IFNULL(total_eur,0) + …Run Code Online (Sandbox Code Playgroud)