【问题标题】:Set default value of a field using classmethod in Django在 Django 中使用 classmethod 设置字段的默认值
【发布时间】:2023-03-08 01:58:01
【问题描述】:

我在网上找到了很多关于这个主题的类似帖子,但没有一个明确说明问题所在。

代码

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 类。

有我缺少的解决方案吗?

【问题讨论】:

标签: python django django-models django-admin


【解决方案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__)

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

【讨论】:

    【解决方案2】:

    覆盖Item 类的<strong>__init__</strong> 方法并在那里设置默认值,看看这段代码:

    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
    

    【讨论】:

    • 谢谢,但它仍然没有显示链接到Item模型的ModelForm中的默认数字值。例如,在管理面板中,当我添加新项目时,数字字段的输入文本为空。真的没有办法将类方法传递给字段定义中的“默认”关键字吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2019-03-14
    • 2017-11-13
    • 2021-06-22
    • 1970-01-01
    • 2013-12-29
    相关资源
    最近更新 更多