Django以编程方式操作模型字段

2024-04-19 15:20:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用下面的基本模型,允许我们的团队在需要时使用自定义属性(即prefixlength和字段的field_name)将unique_reference字段添加到各种模型中。你知道吗

有没有一个干净和愉快的方式来实现我所期待的Django?你知道吗

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()  

我想说一种可能的方法是在所有模型上规范化unique_reference字段的名称。你知道吗

但这是次优的,因为它需要大量重构,而且在某些情况下语义上是不正确的。你知道吗


Tags: name模型selfreffieldprefixargslength