【问题标题】:How to set a Django model field's NoData value如何设置 Django 模型字段的 NoData 值
【发布时间】:2018-10-19 03:51:07
【问题描述】:

我刚刚意识到我上传到 Django 模型的数据集有一个字段(称为“A”),其中“-999”表示 NoData。这会影响我的计算,但我不想完全从过滤器中排除这些对象,仅用于计算,例如:objects.aggregate(Avg('A'))。

如何告诉我的 Django 模型将此值视为字段 A 的 NoData?我看到 null=True 告诉 Django 将空值存储为 NoData,但是当值 = -999 时它应该存储 Null 怎么办。

如果没有直接的方法,那么每当我进行这些计算时,最好/最有效的方法是使用 exclude() 吗?或者,也许我应该在我的数据库中进行某种替换,以将字段 A 中的 -999 转换为 Null(如何?)。谢谢你

【问题讨论】:

  • 当我阅读你的问题时,我在想“你可能想使用exclude(),然后我到了最后一句话。这可能是计算平均值的最快方法,但是如果您想减少数据库上的负载,那么您应该过滤(排除)并评估查询集并对其进行迭代,计算运行总数和对象数量以获得python 中的平均值,而不是数据库中的平均值。

标签: python django model


【解决方案1】:

一个快速的解决方案是在您的聚合查询中使用exclude

YourModel.objects.exclude(a=-999).aggregate(Avg('a'))

如果您想将 -999 值替换为 None

  1. 使用正确的参数调整您的模型字段(例如:null=True)
  2. 进行架构迁移
  3. 做一个Data Migration

数据迁移需要调用类似的函数:

def update_nodata(apps, schema_editor):
    YourModel = apps.get_model('yourappname', 'YourModel')
    for obj in YourModel.objects.filter(a=-999):
        obj.a = None
        obj.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多