Django:models.py 中的 def save()
Django: def save() in models.py
我正在尝试在我的 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)
这可能吗?感谢您的帮助。
周末愉快!
请不要。这是冗余数据。事实证明,保持数据同步,即使在同一个数据库上,也比乍看起来更具挑战性。 Django 还有几个函数,如 .update(…)
[Django-doc] 来更新 table 中的记录,但绕过 .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(
<b>full_name=Concat(</b>
'first_name', Value(' '), 'last_name',
output_field=CharField()
<b>)</b>
).filter(full_name__icontains='<i>some query</i>')
我正在尝试在我的 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)
这可能吗?感谢您的帮助。
周末愉快!
请不要。这是冗余数据。事实证明,保持数据同步,即使在同一个数据库上,也比乍看起来更具挑战性。 Django 还有几个函数,如 .update(…)
[Django-doc] 来更新 table 中的记录,但绕过 .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(
<b>full_name=Concat(</b>
'first_name', Value(' '), 'last_name',
output_field=CharField()
<b>)</b>
).filter(full_name__icontains='<i>some query</i>')