小编eln*_*ren的帖子

Django Rest Framework序列化程序中的聚合(和其他带注释的)字段

我试图找出添加带注释字段的最佳方法,例如任何聚合(计算)字段到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)

django python-3.x django-rest-framework

40
推荐指数
2
解决办法
1万
查看次数

为什么ReactJS不为动态子项自动生成密钥?

在编写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

javascript reactjs react-jsx

10
推荐指数
1
解决办法
299
查看次数

将Django 1.8中复杂子查询的结果注释为QuerySet

我必须遵循数据库架构:

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)

mysql sql django django-orm django-queryset

0
推荐指数
1
解决办法
1524
查看次数