Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:models.py中的def save()_Python_Django_Django Models_Save - Fatal编程技术网

Python Django:models.py中的def save()

Python Django:models.py中的def save(),python,django,django-models,save,Python,Django,Django Models,Save,我试图在models.py中添加save函数,但似乎我做错了什么。用户必须键入名字和姓氏。如果他或她不再输入任何数据,my 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=

我试图在models.py中添加save函数,但似乎我做错了什么。用户必须键入名字和姓氏。如果他或她不再输入任何数据,my 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还有几个函数,比如更新表中的记录,但是绕过了
.save()
调用

例如,您可以使用一个属性,在Django/Python级别的运行时计算
全名

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}'
例如,如果您希望能够在
全名上进行筛选,您可以使用以下方法进行注释:

从django.db.models导入字符域,值
从django.db.models.functions导入Concat
Coworker.objects.annotate(
全名=Concat(
'名字',值(''),'姓氏',
输出\字段=CharField()
)

).filter(全名\uu icontains='some query')
请不要。这是冗余数据。您可以简单地使用注释或属性计算它。通过保存它,同步任务变得更具挑战性。我同意上面的评论。当你想显示数据时,为什么不特别生成
全名呢?请不要误解:我不想在上面这样的例子中使用它,而是与if-else语句或其他东西结合使用。这只是我需要理解的一个例子,如果这样做是可能的。如果发现官方文件在这种情况下毫无帮助。@fineten:逻辑越复杂,我就越倾向于临时做这件事。保持同步会带来很多麻烦。特别是因为很多Django ORM调用,比如
.update(..)
都不调用
.save(..)
,因此会避免更新字段。
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')