2014-09-02 53 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

相关问题