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正在设置:(
第二种可能性是重新定义每个类中的数字字段,但这似乎并不太漂亮.还有其他方法吗?
有人可以帮忙吗?
通过默认=这样做确实感觉更好,但是你在那里使用的任何东西都无法获得你的类或特定模型.要让它在管理员等地方正确显示,您可以在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)
| 归档时间: |
|
| 查看次数: |
3526 次 |
| 最近记录: |