Django模型继承层次结构中字段的基于类的默认值

xar*_*lis 5 django default field model dynamic

如何在以下方案中完成基于类的默认值?我的意思是,我想继承类为"数字"设置默认值的方式不同:

class OrderDocumentBase(PdfPrintable):
    number = models.PositiveIntegerField(default=self.create_number())

    @classmethod
    def create_number(cls):
        raise NotImplementedError

class Invoice(OrderDocumentBase):
    @classmethod
    def create_number(cls):
        return 1

class CreditAdvice(OrderDocumentBase):
    @classmethod
    def create_number(cls):
        return 2
Run Code Online (Sandbox Code Playgroud)

我已经看过这个stackoverflow问题,但它没有解决同样的问题.我认为唯一可行的就是重载这样OrderDocumentBase__init__方法:

def __init__(self, *args, **kwargs):
    """
    Overload __init__ to enable dynamic set of default to number
    """
    super(OrderDocumentBase, self).__init__(*args, **kwargs)
    number_field = filter(lambda x: x.name == 'number', self._meta.fields)[0]
    number = self.__class__.create_number()
    number_field.default = number
Run Code Online (Sandbox Code Playgroud)

这是有效的,但只是部分和行为非常奇怪.在管理界面中,我可以看到仅在第二页或后一页刷新后才设置默认值.在第一次尝试,None正在设置:(

第二种可能性是重新定义每个类中的数字字段,但这似乎并不太漂亮.还有其他方法吗?

有人可以帮忙吗?

tge*_*cho 5

通过默认=这样做确实感觉更好,但是你在那里使用的任何东西都无法获得你的类或特定模型.要让它在管理员等地方正确显示,您可以在init()而不是save()中设置它.

class OrderDocumentBase(PdfPrintable):
    number = models.PositiveIntegerField()

    def __init__(self, *args, **kwargs):
        super(OrderDocumentBase, self).__init__(*args, **kwargs)
        if not self.pk and not self.number:
            self.number = self.DEFAULT_NUMBER

class Invoice(OrderDocumentBase):
    DEFAULT_NUMBER = 2

class CreditAdvice(OrderDocumentBase):
    DEFAULT_NUMBER = 3
Run Code Online (Sandbox Code Playgroud)