从其他字段派生的 Django 可排序字段

Posted

技术标签:

【中文标题】从其他字段派生的 Django 可排序字段【英文标题】:Django sortable field derived from other fields 【发布时间】:2014-05-16 16:05:24 【问题描述】:

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

在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 文档似乎没有在模型自定义字段文档中提到这一点。

谢谢。

【问题讨论】:

看这里,可能有用:***.com/questions/2168475/… 谢谢,但有点太远超出我想要做的事情来提供帮助。我试图将其修改为我想要的,但它不起作用:( 您使用save 方法只需将其保存到数据库中,您也可以在__unicode__(或python 3.x 中的__str__)中执行此操作。我的方法没有将其保存到数据库但实现它 【参考方案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)

    关于model.objects.extra() 见:https://docs.djangoproject.com/en/dev/ref/models/querysets/#extra

    查询数据库时,/表示你在做整数除法 所以使用CAST AS FLOAT将其转换为float,详情见这里:What is wrong with this SQL Server query division calculation?

【讨论】:

谢谢。我还不能投票,因为我没有声望,但你给了我一些我不知道的东西。我已经设法通过阅读其他一些 SO 帖子来解决它,所以我将在下面发布我的做法。 我很高兴有一天其他人(包括我)会遇到同样的情况,所以另一种方法可能会更好,我会从中学习

以上是关于从其他字段派生的 Django 可排序字段的主要内容,如果未能解决你的问题,请参考以下文章

多态父派生类型

oracle forms builder pl/sql - 访问从其他列派生的列

使用从 VBA 代码派生的值填充表中的字段

OOP 和私有字段的继承

Django中用户定义的派生数据

为啥我不能访问派生构造函数的成员初始化列表中继承的受保护字段?