Django模型继承层次结构中字段的基于类的默认值 [英] Class based default value for field in Django model inheritance hierarchy

查看:208
本文介绍了Django模型继承层次结构中字段的基于类的默认值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How can one accomplish class-based default value in following scheme? I mean, I would like to inherited classes set default value for "number" differently:

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

我看过此stackoverflow问题,但它不解决相同的问题。我认为唯一可以工作的是重载 OrderDocumentBase __ init __ 这样的方法:

I have looked at this stackoverflow question, but it doesn't address the same problem. The only thing I thought would work was overloading OrderDocumentBase's __init__ method like this:

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

这是有效的,但只是部分地,并且表现得非常好。在管理界面中,我可以看到只有在第二次或后续页面刷新之后才设置默认值。首先尝试,正在设置:(

This works, but only partially and behaves quite wierdly. In admin interface, I can see the default being set only after second or latter page refresh. On first try, None is being set :(

第二种可能性是在每个类中重新定义数字字段,但有没有其他的方法吗?

Second possibility is redefinition of number field in each class, but that doesn't seem too much pretty. Is there any other way?

有人可以帮助吗?

推荐答案

通过default =做得更好,但是您在这里使用的任何东西都没有办法获得你的课堂或具体的模型,要在像admin,你可以在 init ()而不是save()中设置它。

It does feel nicer to do this via default=, but anything you use there doesn't have a way to get at your class or specific model. To have it show up properly in places like the admin, you could set it in init() instead of 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

这篇关于Django模型继承层次结构中字段的基于类的默认值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆