Django ORM中的动态视图-最佳方法?

Django ORM中的动态视图-最佳方法?,django,django-models,django-orm,django-aggregation,django-annotate,Django,Django Models,Django Orm,Django Aggregation,Django Annotate,一些背景 我正在考虑用Django重建现有的Laravel网站。这是一个允许共享无人机/无人机推进组件基准数据的网站。一些基准测试是在同时测试多个电机和螺旋桨时进行的,这意味着电池将承受多个电机的负载,但也意味着来自一个螺旋桨的气流会对另一个螺旋桨上捕获的数据产生影响。这意味着数据是物理耦合的。现在,我正在尝试构建这个项目,以允许即将推出的特性,并看看Django ORM是否适合 简化的Django模型 class Benchmark(models.Model): title = mod

一些背景

我正在考虑用Django重建现有的Laravel网站。这是一个允许共享无人机/无人机推进组件基准数据的网站。一些基准测试是在同时测试多个电机和螺旋桨时进行的,这意味着电池将承受多个电机的负载,但也意味着来自一个螺旋桨的气流会对另一个螺旋桨上捕获的数据产生影响。这意味着数据是物理耦合的。现在,我正在尝试构建这个项目,以允许即将推出的特性,并看看Django ORM是否适合

简化的Django模型

class Benchmark(models.Model):
    title = models.CharField()
    private = models.BooleanField(default=False)
    hide_torque = models.BooleanField(default=False)


class AbstractComponent(models.Model):
    brand = models.CharField()
    name = models.CharField()

    class Meta:
        abstract = True


class Motor(AbstractComponent):
    shaft_diameter_mm = models.FloatField()


class Propeller(AbstractComponent):
    diameter_in = models.FloatField()


class Battery(AbstractComponent):
    capacity_kwh = models.FloatField()


class Powertrain(models.Model):
    benchmark = models.ForeignKey(Benchmark, on_delete=models.CASCADE, related_name='powertrains')
    motor = models.ForeignKey(Motor, on_delete=models.CASCADE)
    propeller = models.ForeignKey(Propeller, on_delete=models.CASCADE, blank=True, null=True)
    battery = models.ForeignKey(Battery, on_delete=models.CASCADE, blank=True, null=True)


class DerivedDataManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset()\
            .annotate(electrical_power_w=F('voltage_v') * F('current_a'))\
            .annotate(mechanical_power_w=F('torque_nm') * F('rotation_speed_rad_per_s'))\
            .annotate(motor_efficiency=F('mechanical_power_w') / F('electrical_power_w'))


class DataSample(models.Model):
    powertrain = models.ForeignKey(Powertrain, on_delete=models.CASCADE, related_name='data')
    time_s = models.FloatField()
    voltage_v = models.FloatField(blank=True, null=True)
    current_a = models.FloatField(blank=True, null=True)
    rotation_speed_rad_per_s = models.FloatField(blank=True, null=True)
    torque_nm = models.FloatField(blank=True, null=True)
    thrust_n = models.FloatField(blank=True, null=True)

    objects = models.Manager()
    derived = DerivedDataManager()

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['powertrain', 'time_s'], name='unique temporal sample')
        ]
问题

我能够在每一行数据中添加“衍生”测量值,如电力,但我不知道如何添加衍生测量值,将同一基准内多个传动系的数据组合在一起:

假设有3个动力系,每个动力系都有自己的电压和电流数据,我该如何做:

总动力=动力传动系1.动力+动力传动系2.动力+动力传动系3.动力

对于每个单独的时间戳(时间)?总功率只有在同时采集的样本上求和时才是有效的

目标

在Django中不加载所有数据库数据的情况下,考虑到一些业务逻辑,我最终希望获得最大总功率方面的5个顶级基准:

  • 标记为private的基准会自动排除(直到auth进入)
  • 选择隐藏转矩的基准会自动生成转矩数据,同时所有衍生的机械功率和电机效率值都将变为零

我想重新创建,但附加了额外的列,如“最大推力”,等等。。。此表是从数据库本身内部分页的。

Hmmmm,这是一个很难导航的表。首先,我将添加以下注释模型方法:

from django.db.models import Sum
我想这将是一个添加以下内容的案例:

.annotate(total_power=Sum(electrical_power_w))
但我认为问题在于,
DerivedDataManager
queryset
中的每一行代表一个
DataSample
,而这一行又通过
ForeignKey
字段链接到一个
动力传动系统

最好在业务逻辑层中按动力系统的UUID进行分组(您需要将其添加到
动力系统
模型中-有关如何使用它的详细信息,请参阅。然后,由于您已按分组,因此您可以将
Sum
注释应用到
查询集

因此,我认为您希望沿着这条路径导航:

DataSample.objects.order_by(
    'powertrain'
).aggregate(
    total_price=Sum('electrical_power_w')
)

很好,这似乎是正确的方向。根据你的回答,我尝试了:DataSample.derived.values('power\u benchmark','time\u s')。注释(total\u power=Sum('electrical\u power\u w'))。order\u by('total\u power'))这几乎满足了我的需要。现在我需要提取每个时间戳的最大总功率。@诀窍太棒了,请让我推动您的进一步。您的数据结构是什么样的?很乐意为您提供帮助吗?@[Wind Up Lord Vexxos]我使用Django Admin手动创建了一些数据,有没有推荐的方法来共享这些数据,可能是使用种子脚本?