dynamic - Class based default value for field in Django model inheritance hierarchy -
how can 1 accomplish class-based default value in following scheme? mean, inherited classes set default value "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
i have looked @ this stackoverflow question, doesn't address same problem. thing thought work overloading orderdocumentbase
's __init__
method this:
def __init__(self, *args, **kwargs): """ overload __init__ enable dynamic set of default 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, partially , behaves quite wierdly. in admin interface, can see default being set after second or latter page refresh. on first try, none
being set :(
second possibility redefinition of number field in each class, doesn't seem pretty. there other way?
can help?
it feel nicer via default=, use there doesn't have way @ class or specific model. have show in places admin, set 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 , not self.number: self.number = self.default_number class invoice(orderdocumentbase): default_number = 2 class creditadvice(orderdocumentbase): default_number = 3
Comments
Post a Comment