2012-10-28 29 views
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」被視爲模型字段,而未定義。

我想知道我應該使用哪些其他解決方法/技術?謝謝。

回答

3

uuid_length類變量在子類中,從而:

class SomeModel(BaseUuid, SomeOtherMixin): 

    uuid_length = 20 // or whatever... 

    ... 

在基類的save方法self.uuid_length的引用將是指子類的uuid_length作爲打算。

+0

這將在表中創建一個字段「uuid_length」,這是不好的。我只想把「uuid_length」作爲內部變量。 – devfeng

+0

@danielfeng - 實際上它不會。如果您將類字段賦給'model.CharField()'等,Django只創建表字段。您仍然可以使用普通的類變量而不創建字段。 Django忽略它們。 – Ghopper21

+0

你說得對。感謝Ghopper21! – devfeng

相關問題