2012-03-28 219 views
3

在我的應用程序中,我定義了一個自定義字段來表示使用quantities包的物理量。自定義排序在Django的自定義字段中

class AmountField(models.CharField): 
    def __init__(self, *args, **kwargs): 
     ... 

    def to_python(self, value): 
     create_quantities_value(value) 

本質上,它的工作方式是它延伸CharField的值存儲在數據庫中的

"12 min" 

一個字符串,其表示爲批量使用領域模型時對象

array(12) * min 

然後,在模型它被用作這樣:

class MyModel(models.Model): 
    group = models.CharField() 
    amount = AmountField() 

    class Meta: 
     ordering = ['group', 'amount'] 

我的問題是這些字段似乎不是按數量排序,而是按字符串排序。

所以,如果我有包含類似

  • 一些對象{ 「基團」: 「A」, 「量」: 「12分鐘」}
  • { 「基團」: 「A」, 「數量」:「20分鐘」}
  • {「group」:「A」,「amount」:「2min」}
  • {「group」:「B」,「amount」:「20min」 }
  • {「group」:「B」,「amount」:「1 hr」}

他們最終排序如下:

>>> MyModel.objects.all() 
[{A, 12 min}, {A, 2 min}, {A, 20 min}, {B, 1 hr}, {B, 20 min}] 

基本上按字母順序。

我可以給我的自定義AmountField一個比較函數,以便它可以通過python值而不是DB值進行比較嗎?

回答

0

您可以將它與前導零存儲在數據庫中嗎?

E.g. 「02分」

這樣它會正確排序,當你再次解析它時,前導零應該無關緊要。

+0

這不是一個真正的選擇。首先,我使用[quantity](http://packages.python.org/quantities/user/tutorial.html)對象的字符串表示形式,並且不必編輯該代碼。即使我做了,也會有未知數量的前導零。我用它來存儲不只是時間,而是任何東西。例如,可能是10000磅。 – RotaJota 2012-03-28 17:04:55

1

我認爲沒有辦法將它排序爲數字。我的意思是沒有有效的方法,因爲我相信Django允許以某種方式通過計算領域進行排序,但是您必須計算所有鍵來執行此操作。因此,儘量找到一種方法將數字作爲數字存儲在數據庫中。也許將數量存儲爲整數並添加方法或屬性以將其轉換爲數量對象?類似這樣的:

class MyModel(models.Model): 
    group = models.CharField() 
    amount = models.IntegerField() # or PositiveIntegerField 

    class Meta: 
     ordering = ['group', 'amount'] 

    def amountAsQuantityObject(self): 
     return create_quantities_value(self.amount) 

    # or as a property 
    quantity_object = property(amountAsQuantityObject) 
+0

在這種情況下,是否有可能在數據庫中有一個自定義的django字段存儲爲兩列(一列爲金額,一爲單位)?即使那樣,我想能夠比較python對象,因爲這不允許在不同單位(分鐘和小時,例如)之間進行比較。 – RotaJota 2012-03-28 17:49:45

+0

有一個[ticket](https://code.djangoproject)。 com/ticket/5929)關於多列字段。作爲一種解決方法:您可以使用[pickle](http://docs.python.org/library/pickle.html)模塊序列化數量對象。這不是很舒服,但如果你想要有效的分類,你必須爲一種資源(時間,體重等)選擇一個測量單位。 – Kirill 2012-03-28 18:04:58

+1

我想知道你是不是讓自己變得不必要的困難。我知道你更喜歡做一個Python排序,但是這要求你先將數據庫中的所有內容加載到內存中,然後再進行排序。我還強烈建議不要將相同類型(時間,距離,重量)的不同單位存儲在數據庫中,只是將所有內容存儲爲例如分鐘和工作。 – knabar 2012-03-28 18:15:29

0

我打算採用完全不同的方法。

而不是有一個自定義字段來存儲什麼是真正的時間單位,爲什麼不只是存儲時間單位?

例如,02分鐘,應該只是02.您可以存儲爲整數,或者我認爲有一個TimeField可以讓您以單位時間存儲單位。

你顯然希望它顯示,以便人類可以正確理解02真的意味着2分鐘,所以只需在窗體中編寫一個自定義過濾器來處理分鐘或小時或任何你可能想要添加到結尾。

這會帶來其他好處。假設您想添加以前的所有時間單位。爲此,需要進行一些字符串處理,並將該字符串部分更改爲具有的地址,或者添加的子地址或類似的方法。