2009-08-27 32 views
3

我有一个模型,保存用户地址。此模型必须具有first_name和last_name字段,因为人们想将地址设置为收件人(如他的公司等)。我想要实现的是:Django空场后备

  • 如果在地址fist_name /姓氏字段填 - 简单地返回现场
  • 如果在地址fist_name /姓氏字段为空 - 取corrresponding场数据从指向正确django.auth.models.User一个ForeignKey
  • 我想这将被视为普通的Django场,这将是目前在领域中查找
  • 我不想创建一个方法,因为这是一个重构,Address.first_name/last_name用于应用程序的各个位置(也用于模型表单等),所以我需要这样对我来说就像po ssible要不然我会在很多地方鼓捣左右

感谢您的帮助:)

回答

5

这里有两个选项。首先是创建一个方法来动态查找它,但使用装饰器,以便其他代码仍然可以使用直属属性访问。

class MyModel(models.Model): 
    _first_name = models.CharField(max_length=100, db_column='first_name') 

    @property 
    def first_name(self): 
     return self._first_name or self.user.first_name 

    @first_name.setter 
    def first_name(self, value): 
     self._first_name = value 

即使相关用户发生更改,也会始终引用first_name的最新值。你可以得到/准确设置属性,你会一个属性:myinstance.first_name = 'daniel'

另一种选择是如此,它并当您保存查询重写模型save()方法:

def save(self, *args, **kwargs): 
    if not self.first_name: 
     self.first_name = self.user.first_name 
    # now call the default save() method 
    super(MyModel, self).save(*args, **kwargs) 

这样,你不不必改变你的数据库,但它只在保存时刷新 - 所以如果相关的用户对象被更改,但这个对象不是,它会引用旧的用户值。

+0

您可以指定db_column ='first_name'来防止模式更改:http://docs.djangoproject.com/en/dev/ref/models/fields/#db-column – 2009-08-27 18:11:56

+0

所以在@ first_name.setter thingy只需添加first_name.db_column =“first_name”?我能做到:address = Address.objects.get(first_name =“blah”)? – pielgrzym 2009-08-27 18:18:32

+0

我已经更新了代码和解释以回应piquadrat的评论。 – 2009-08-27 18:31:31