Django可排序字段派生自其他字段

时间:2014-04-04 11:10:06

标签: python django django-models

用自己的答案编辑:原始问题如下。

here中,它推荐了一些方法,对我来说最简单的方法是添加一个额外的字段但覆盖保存以更新它,然后我免费获得标准功能。所以我的应用程序现在是:

#views.py
highest_p2w = Car.objects.filter().order_by('-p2w')[0]
lowest_p2w = Car.objects.filter().order_by('p2w')[0]

#models.py
p2w = models.FloatField("Power to weight ratio",editable=False)

def save(self, *args, **kwargs):
    self.p2w = (float(self.bhp) * 1000 ) / float(self.weight)
    super(Car, self).save(*args, **kwargs)

唯一的缺点是我必须对任何现有记录执行save()来更新值。但是任何新记录都会在save()时输入值。


原始问题

我希望拥有一个动态值,该值是根据模型中Django返回的2个字段计算的。

我想我可以用一种方法做到这一点,但我需要能够像其他字段一样对它进行排序。

#Models.py:
class Car(models.Model):
    weight = models.IntegerField("Weight in KG")
    bhp = models.IntegerField("BHP")

我希望有一个名为power_to_weight_ratio的字段,只计算(self.bhp * 1000)/ self.weight

由于这是一个动态值,因此不需要存储。但它确实需要是可排序的,因为我对模型中的所有其他字段进行了排序。

我认为我可以做一些像

这样的事情
power_to_weight = ( self.bhp * 1000 ) / self.weight

但我认为我需要开始重写方法以使我能够排序。 Django文档似乎没有在模型自定义字段文档中提到这一点。

感谢。

1 个答案:

答案 0 :(得分:1)

我很高兴我做到了! ^ _ ^自由地享受它

我尝试过以下最符合您需求的(测试sqlite3数据库)

admin.py

from django.contrib import admin
from .models import Car

class CarAdmin(admin.ModelAdmin):
    list_display = ('weight','bhp','power_to_weight2',)

    def queryset(self,request):
        return super(CarAdmin,self).queryset(request).extra(select={'ptw':'(CAST((bhp) AS FLOAT))/weight'})

    def power_to_weight2(self,obj):
        return obj.bhp*1000/float(obj.weight)#python 2.x,float not need in python3.x
    power_to_weight2.short_description = 'power_to_weight'
    power_to_weight2.admin_order_field = 'ptw'

admin.site.register(Car,CarAdmin)
  1. 关于model.objects.extra(),请参阅:https://docs.djangoproject.com/en/dev/ref/models/querysets/#extra

  2. 查询数据库时,/表示您正在进行整数除法 所以使用CAST AS FLOAT将其转换为浮动,详细信息请参见此处:What is wrong with this SQL Server query division calculation?