Django:models.py 中的 def save()

Posted

技术标签:

【中文标题】Django:models.py 中的 def save()【英文标题】:Django: def save() in models.py 【发布时间】:2020-08-21 10:11:56 【问题描述】:

我正在尝试在我的 models.py 中添加保存功能,但似乎我做错了什么。用户必须输入名字和姓氏。如果他或她不再输入任何数据,我的 models.py 中的另一个字段应该由这些字段的组合填充。

models.py:

class Coworker(models.Model):
    first_name = models.CharField(max_length=50, null=False, blank=False)
    last_name = models.CharField(max_length=50, null=False, blank=False)
    full_name = models.CharField(max_length=100, null=False, blank=False)

    def save(self, *args, **kwargs):
        self.full_name = self.first_name + " " + self.last_name
        super().save(*args, **kwargs)

这甚至可能吗?感谢您的所有帮助。

周末愉快!

【问题讨论】:

请不要。这是冗余数据。您可以使用注释或属性简单地计算它。通过保存它,您可以使同步成为一项更具挑战性的任务。 我同意上面的评论。当您要显示数据时,为什么不生成 full_name ad-hoc? 请不要误会:我不想在上面这样的例子中使用它,而是与 if-else-statement 或其他东西结合使用。这只是我的一个例子去理解,如果这样的事情是可能的。 如果发现官方文档在这种情况下是相当无用的。 @finethen:逻辑越复杂,我就越倾向于临时做这个。保持同步会带来很多麻烦。尤其是因为很多 Django ORM 调用,比如 .update(..) 不会调用 .save(..),因此会规避更新字段。 【参考方案1】:

请不要。这是冗余数据。事实证明,即使在同一个数据库上,保持数据同步也比乍看之下更具挑战性。 Django 还有几个函数,如.update(…) [Django-doc] 来更新表中的记录,但绕过了.save() 调用。

例如,您可以使用一个属性,该属性将在运行时在 Django/Python 级别计算 full_name

class Coworker(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    @property
    def full_name(self):
        return f'self.first_name self.last_name'

如果您希望能够过滤full_name,例如,您可以进行注释,在这种情况下使用Concat [Django-doc]:

from django.db.models import CharField, Value
from django.db.models.functions import Concat

Coworker.objects.annotate(
    full_name=Concat(
        'first_name', Value(' '), 'last_name',
         output_field=CharField()
    )
).filter(full_name__icontains='some query')

【讨论】:

以上是关于Django:models.py 中的 def save()的主要内容,如果未能解决你的问题,请参考以下文章

新闻网站项目django--首页

Django admin 设置和定制

Django 之 分表

models.py中增加了字段,django中怎样更新

Django学习---Models(ORM框架)

新闻网站项目django--注册页