在django中,我如何构造一个给出子类总和的方法

时间:2018-06-04 15:48:15

标签: django django-models

我的问题基本上就是这个。我有一个类(让我们说跑步者)和一个子类(比如说有跳跃或什么的,用于不同的跳跃)。现在我想要一个类中的变量,它是跳跃的总和。基本上是:

    internal static bool IsSimpleType(Type type)
    {
        return type.IsPrimitive ||
               type.Equals(typeof(string)) ||
               type.Equals(typeof(DateTime)) ||
               type.Equals(typeof(Decimal)) ||
               type.Equals(typeof(Guid)) ||
               type.Equals(typeof(DateTimeOffset)) ||
               type.Equals(typeof(TimeSpan));
    }

    internal static bool IsSimpleUnderlyingType(Type type)
    {
        Type underlyingType = Nullable.GetUnderlyingType(type);
        if (underlyingType != null)
        {
            type = underlyingType;
        }

        return TypeHelper.IsSimpleType(type);
    }

    internal static bool HasStringConverter(Type type)
    {
        return TypeDescriptor.GetConverter(type).CanConvertFrom(typeof(string));
    }

???是否有证明这是我想要的东西。是否有可能沿着这些方式实现这一点,然后可以在Runner类中定义一个使用total_time的新函数吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下,您通常不会注释,而是聚合。您可以在Sum上使用Leap来获取特定参赛者的class Runner(model.Model): # ... def total_time(self): return self.leap_set.aggregate(total=Sum('time'))['total_time'] or 0,例如:

or 0

如果Leap的集合为空,则使用None。在这种情况下,汇总将是or 0。通过使用leap_set,我们将其替换为零。

没有Leap(作为相关名称)的替代方法是过滤class Runner(model.Model): # ... def total_time(self): return (Leap.objects.filter(runner=self) .aggregate(total=Sum('time'))['total_time'] or 0)个对象:

Runner

如果您想使用total_time注释.annotate整个查询集,可以使用from django.db.models.functions import Coalesce Runner.objects.annotate(total_time=Coalesce(Sum('leap__time'), 0))

Coalesce

我们这里使用0函数来使用None代替Leap,以防measureView(event: Object) { console.log(`*** event: ${JSON.stringify(event.nativeEvent)}`); // you'll get something like this here: // {"target":1105,"layout":{"y":0,"width":256,"x":32,"height":54.5}} } render() { return ( <View onLayout={(event) => {this.measureView(event)}} /> ); } s的集合为空。