2011-09-22 91 views
0

對於數據庫索引目的,模型上的電子郵件字段需要反向存儲。我最終需要訪問電子郵件字段的反向和正向版本。我很好奇以下哪種方法會被視爲最佳做法。django模型中依賴字段的最佳做法

方法A 覆蓋模型上的save方法。此方法使數據庫非標準化,並且不能在查詢集上使用update方法。有些需要覆蓋爲模型生成的表單。

class Foo(models.Model): 
    email_forward = models.CharField(max_length = 320) 
    email_reversed = models.CharField(max_length = 320) 

    def save(self, *args, **kwargs): 
    self.email_reversed = reversed(self.email_forward) 
    super(Foo, self).save(*args, **kwargs) 

方法B 這種方式具有更好的數據庫正常化。仍允許您在查詢集上使用update方法。擰緊表格,以至於不得不覆蓋爲模型生成的所有默認表格。

class Foo(models.Model): 
    _email = models.CharField(max_length = 320) 

    @property 
    def email_forward(self): 
    if not hasattr(self, 'email_f'): 
     self.email_f = reversed(self._email) 
    return self.email_f 

    @email.setter 
    def email_forward(self, value): 
    self.email_f = value 
    self._email = reversed(value) 

    @propery 
    def email_reversed(self): 
    return self._email 

澄清

任何備選答案需要滿足具有存儲在數據庫中的反向電子郵件的最低要求。然而,這個問題並不是尋找對這個特定問題的答案,而是獲得關於這種場景的最佳實踐的反饋,其中有兩個可以相互計算的字段,但前者需要一個字段,和其他在後端方面

回答

1

的型號:

class Foo(models.Model): 
    email = models.CharField(max_length=320) 

    def _get_email_reversed(self): 
     return self.email[::-1] 

    def _set_email_reversed(self, value): 
     self.email = value[::-1] 

    email_reversed=property(_get_email_reversed, _set_email_reversed) 

和表單:

class FooForm(forms.ModelForm):  
    class Meta: 
     model = Foo 

不知道你的「螺絲釘起來的形式」的意思,但這種模式將形成只有一個字段 - email。我還添加了如何使用模型的示例:

def test_foo(self): 
    foo = Foo() 
    foo.email = '[email protected]' 
    self.assertEquals(foo.email_reversed, '[email protected]') 

def test_set_foo_reversed(self): 
    foo = Foo() 
    foo.email_reversed = '[email protected]' 
    self.assertEquals(foo.email, '[email protected]') 
+0

必須將電子郵件地址反向存儲在數據庫中才能進行索引。儘管如此,這還不算什麼。也許更好的措辭是,我需要數據庫中的非人類可讀版本,但有一個我需要訪問的人類可讀版本,並且在形式等事情中,我從不需要看到非人類可讀版本。 –

+0

其實你可以在上面的代碼中存儲電子郵件的反轉版本(我已經更新了測試代碼的一個簡單例子)。調用'foo.email_reversed'會給你正確的轉發版本。如果你正在尋找一些不安全但不可讀的東西,你可以做一些簡單的事情,比如base64編碼。如果您正在尋找SECURE(即不能簡單解密任何人的電子郵件),您需要查看加密。 –

+0

這不是一個安全問題,必須以反轉格式將值存儲在數據庫中。由於我的數據庫如何使用索引,查詢'WHERE email LIKE foo%'確實使用索引,但查詢'WHERE email LIKE%foo'不會。除此之外,這個問題並不是關於具體問題,因爲我的解決方案都有效。我很好奇人們覺得什麼是適當的最佳做法。 –

相關問題