Python 在Django中使用classmethod设置字段的默认值

Python 在Django中使用classmethod设置字段的默认值,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,我在网上找到了很多关于这个话题的类似帖子,但没有人明确指出问题出在哪里 代码 class Item(models.Model): @classmethod def get_next_item_number(cls): return cls.objects.count() + 1 number = models.IntegerField(default=get_next_item_number) class Item(models.Model):

我在网上找到了很多关于这个话题的类似帖子,但没有人明确指出问题出在哪里

代码

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

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

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

当我访问Django管理面板时,与“number”字段相关的文本字段包含

<classmethod object at 0x7fab049d7c50>
但当我运行django服务器时,我得到:

number = models.IntegerField(default=get_next_item_number())
TypeError: 'classmethod' object is not callable
我知道通过将get_next_item_number()声明为一个外部函数可以防止所有这些,但这个解决方案对我来说并不优雅,因为get_next_item_number()只引用item类


是否有我缺少的解决方案?

覆盖
\uuuu init\uuuu
项的
方法,并在其中分配默认值,查看此代码:

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
我找到了这个解决方案:

代码

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

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

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

我不完全了解可能的后果,但它是有效的。

看看:当我构建与项目模型关联的ModelForm时,这些解决方案不提供默认值。我宁愿使用一个外部函数。谢谢,但它仍然没有在链接到项目模型的ModelForm中显示默认的数字值。例如,在管理面板中,当我添加新项目时,数字字段的输入文本为空。真的没有办法在字段定义中将classmethod传递给'default'关键字吗?