Здесь есть пара проблем. Во-первых, self.method
не будет работать. Нет self
в контексте тела класса, где вы объявляете PositiveIntegerField
.
Во-вторых, передача вызываемого не будет работать, так как вызываемый объект связывается во время компиляции и не изменяется во время выполнения. Так что, если вы определите, скажем,
class OrderDocumentBase(PdfPrintable):
create_number = lambda: return 0
number = models.PositiveIntegerField(default=create_number)
class Invoice(OrderDocumentBase):
create_number = lambda: return 1
Все Invoice
экземпляры все равно получат 0
в качестве значения по умолчанию.
Один из способов решения этой проблемы - переопределить метод save()
. Вы можете проверить, не был ли указан number
, и установить его по умолчанию перед сохранением.
class OrderDocumentBase(PdfPrintable):
number = models.PositiveIntegerField()
def save(self, *args, **kwargs):
if not self.number:
self.number = self.DEFAULT
super(OrderDocumentBase, self).save(*args, **kwargs)
class Invoice(OrderDocumentBase):
DEFAULT = 2
class CreditAdvice(OrderDocumentBase):
DEFAULT = 3
Я протестировал вышеупомянутое с небольшим изменением (сделал OrderDocumentBase
абстрактным, так как у меня не было PdfPrintable
), и это сработало, как и ожидалось.