簡體   English   中英

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

[英]Django sortable field derived from other fields

編輯有自己的答案:以下是原始問題。

這里,它推薦了一些方法,而對我來說,最簡單的方法是僅添加一個額外的字段,但覆蓋保存以對其進行更新,然后我免費獲得標准功能。 所以我的應用現在是:

#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文檔似乎在模型自定義字段文檔中沒有提及這一點。

謝謝。

我很高興自己做到了! ^ _ ^免費享受

我嘗試了以下最滿足您需求的內容(經過測試的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 : model.objects.extra()

  2. 查詢數據庫時,/表示您正在執行整數除法,因此請使用CAST AS FLOAT將其轉換為float,詳細信息請參見: SQL Server查詢除法計算有什么問題?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM