2014-09-02 98 views
3

我在網上發現了很多關於此主題的類似帖子,但沒有人明確指出哪個是問題。在Django中使用classmethod設置字段的默認值

代碼

class Item(models.Model): 
    @classmethod 
    def get_next_item_number(cls): 
     return cls.objects.count() + 1 

    number = models.IntegerField(default=get_next_item_number) 

問題

當我訪問Django管理面板相關的 '數字' 域中的文本字段包含

<classmethod object at 0x7fab049d7c50> 

所以我試圖改變以上代碼

class Item(models.Model): 
    @classmethod 
    def get_next_item_number(cls): 
     return cls.objects.count() + 1 

    number = models.IntegerField(default=get_next_item_number()) 

但是當我運行Django的服務器我得到:

number = models.IntegerField(default=get_next_item_number()) 
TypeError: 'classmethod' object is not callable 

我知道這一切可以通過聲明get_next_item_number()作爲外部功能來防止,但是這種解決方案是不優雅我,因爲get_next_item_number()是指只有Item類。

有沒有我失蹤的解決方案?您Item

+0

看看:http://stackoverflow.com/questions/3786987/class-based-default-value-for-field-in-django-model-inheritance-hierarchy – xecgr 2014-09-02 12:07:40

+0

這些解決方案不提供默認值時我構建了與Item模型關聯的ModelForm。我寧願使用外部函數。 – Sirion 2014-09-02 12:16:55

回答

1

我發現這個解決方案:

代碼

class Item(models.Model): 
    @staticmethod 
    def get_next_item_number(): 
     return Item.objects.count() + 1 

    number = models.IntegerField(default=get_next_item_number.__func__) 

我並沒有完全意識到可能產生的後果,但它有效。

0

覆蓋__init__方法和assing默認值出現,看看這個代碼:

from django.db import models 
class Item(models.Model): 
    number = models.IntegerField() 
    @classmethod 
    def get_next_item_number(cls): 
     return cls.objects.count() + 1 
    def __init__(self, *args, **kwargs): 
     super(Item, self).__init__(*args, **kwargs) 
     if not self.pk and not self.number: 
      self.number = Item.get_next_item_number() 

而這裏的流量輸出

>>> from your_app import models 
>>> models.Item().save() 
>>> models.Item().number 
>>> 2 
>>> models.Item().save() 
>>> models.Item().number 
>>> 3 
>>> models.Item.objects.filter(id=1)[0].number #number only get its value from classmethod on new items 
>>> 1 
+0

謝謝你,但它仍然不會顯示鏈接到Item模型的ModelForm中的默認數值。例如,在管理面板中,當我添加一個新項目時,數字字段的輸入文本是空的。是不是真的有辦法將字段定義中的類方法傳遞給'default'關鍵字? – Sirion 2014-09-02 14:00:56

相關問題