我想使用以下基本模型,以允许我们的团队使用自定义属性(即unique_reference
,prefix
和{{}在需要时向各种模型添加length
字段1}}该领域)。
是否有一种干净而愉快的方式来实现我正在寻找的Django?
field_name
我想说一种可能的方法是在所有模型上规范化class UniqueFieldModel(models.Model):
class Meta:
abstract = True
def __init__(self, *args, **kwargs):
self.prefix = getattr(self.Meta, 'unique_reference_prefix')
self.unique_ref_length = getattr(self.Meta, 'unique_reference_field_name',
settings.UNIQUE_REFERENCE_MAX_LENGTH)
unique_ref_field_name = getattr(self.Meta, 'unique_reference_field_name')
unique_reference_field = models.CharField(
max_length=self.unique_ref_length,
blank=False,
null=False
)
setattr(self, unique_ref_field_name, unique_reference_field)
super(UniqueFieldModel, self).__init__(*args, **kwargs)
def save(self, *args, **kwargs):
if not self.unique_reference:
prefix = getattr(self.Meta, 'unique_reference_prefix')
self.unique_reference = \
self.gen_unique_value(
prefix,
lambda x: get_random_string(x),
lambda x: self.objects.filter(unique_reference=x).count(),
self.unique_ref_length
).upper()
字段的名称。
但它不是最理想的,因为它需要大量的重构,并且在某些情况下在语义上是不正确的。