Django空场后备

pie*_*zym 4 python django field django-models models

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

  • 如果地址中的fist_name/last_name字段已填充 - 只返回该字段
  • 如果地址中的fist_name/last_name字段为空 - 从指向正确的django.auth.models.User的外键中获取相应的字段数据
  • 我希望将其视为字段查找中存在的普通django字段
  • 我不想创建一个方法,因为它是一个重构,并且Address.first_name/last_name在应用程序的不同位置使用(也在模型表单等中),所以我需要这个尽可能顺利,否则我在很多地方都要修补一下

感谢帮助 :)

Dan*_*man 6

这里有两个选择.第一个是创建一个动态查找它的方法,但使用property装饰器,以便其他代码仍然可以使用直接属性访问.

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
Run Code Online (Sandbox Code Playgroud)

这将始终引用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)
Run Code Online (Sandbox Code Playgroud)

这样您就不必更改数据库,但只在保存时刷新 - 因此,如果相关的User对象已更改但此对象未更改,则它将引用旧的User值.