0

ほとんどすべてのモデルに uuid フィールドがあります。冗長性を避けるために、この BaseUuid 抽象モデルを使用してランダムな uuid フィールドを生成します。

class BaseUuid(models.Model):  # base abstract model with uuid field
    class Meta:
        abstract = True

    uuid = models.CharField(max_length=22, unique=True)

    def save(self, *args, **kwargs):
        if not self.uuid:
            uuid = shortuuid.uuid()[:10]
            while self.__class__.objects.filter(uuid=uuid).exists():
                uuid = shortuuid.uuid()[:10]
            self.uuid = uuid
        super(BaseUuid, self).save(*args, **kwargs)

お気づきかもしれませんが、上記のコードの uuid の長さは固定 (10) です。

今は、その長さを柔軟に設定できるようにしたいと考えています。私は次のようなものが欲しい:

class BaseUuid(models.Model):  # base abstract model with uuid field
    class Meta:
        abstract = True

    uuid = models.CharField(max_length=22, unique=True)

    def __init__(self, uuid_length=10, *args, **kwargs):
        super(BaseUuid, self).__init__(*args, **kwargs)
        self.uuid_length = 22 if uuid_length > 22 else 5 if uuid_length < 5 else uuid_length

    def save(self, *args, **kwargs):
        if not self.uuid:
            uuid = shortuuid.uuid()[:self.uuid_length]
            while self.__class__.objects.filter(uuid=uuid).exists():
                uuid = shortuuid.uuid()[:self.uuid_length]
            self.uuid = uuid
        super(BaseUuid, self).save(*args, **kwargs)

アイデアは、uuid_length パラメータを有効にすることです。

class SomeModel(BaseUuid(uuid_length=6), SomeOtherMixin):
    ...

しかし、うまくいかないようです。BaseUuid は models.Model からサブクラス化されているため、「self.uuid_length」は未定義のままモデル フィールドとして扱われていました。

他にどのような回避策や技術を使用すればよいのでしょうか? ありがとう。

4

1 に答える 1

3

したがって、サブクラスuuid_lengthでクラス変数を作成します。

class SomeModel(BaseUuid, SomeOtherMixin):

    uuid_length = 20 // or whatever...

    ...

self.uuid_length基本クラスのメソッドでの参照は、意図saveしたとおりにサブクラスを参照しuuid_lengthます。

于 2012-10-28T22:50:16.120 に答える