ほとんどすべてのモデルに 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」は未定義のままモデル フィールドとして扱われていました。
他にどのような回避策や技術を使用すればよいのでしょうか? ありがとう。