0
我在所有模型中都有uuid字段。爲了避免冗餘,我這個BaseUuid抽象模型來生成隨機UUID字段:具有靈活性的Django抽象模型可以接受參數
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 lengh(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」被視爲模型字段,而未定義。
我想知道我應該使用哪些其他解決方法/技術?謝謝。
這將在表中創建一個字段「uuid_length」,這是不好的。我只想把「uuid_length」作爲內部變量。 – devfeng
@danielfeng - 實際上它不會。如果您將類字段賦給'model.CharField()'等,Django只創建表字段。您仍然可以使用普通的類變量而不創建字段。 Django忽略它們。 – Ghopper21
你說得對。感謝Ghopper21! – devfeng