对于数据库索引,模型上的电子邮件字段需要反向存储。我最终需要访问电子邮件字段的反向和正向版本。我很好奇以下哪种方法被认为是最佳实践。
方法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
澄清
任何替代答案都需要满足将反向电子邮件存储在数据库中的最低要求。然而,这个问题不是找到这个特定问题的答案,而是获得有关这种情况的最佳实践的反馈,其中你有两个可以相互计算的字段,但在前端上下文中需要一个,另一个在后端环境中
答案 0 :(得分: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 = 'moc.elpmaxe@liametset'
self.assertEquals(foo.email_reversed, 'testemail@example.com')
def test_set_foo_reversed(self):
foo = Foo()
foo.email_reversed = 'testemail@example.com'
self.assertEquals(foo.email, 'moc.elpmaxe@liametset')