gpt4 book ai didi

django - 在保存 Django 模型实例时,相对于用作 ModelField 属性的方法,我的 clean() 和 save() 覆盖应用的顺序是什么?

转载 作者:行者123 更新时间:2023-12-02 00:23:19 25 4
gpt4 key购买 nike

我有一个带有 first_namelast_name 字段的模型,它们用于在 ImageField 上创建文件名。 ImageFieldupload_to 的参数是使用此实例信息生成文件名的方法。

保存此模型实例时,是否会在 clean() 中对 .strip() 的调用在字段用于生成文件名之前应用于这些字段?或者我是否需要在使用数据时以及清理数据时对数据执行 .strip() 操作?

模型.py:

def set_path(instance, filename):
"""
Set the path to be used for images uploaded (trainer photos).
"""
return u'about/%(first)s_%(last)s.%(ext)s' % {
'first': instance.first_name.strip(' \t').lower(), #.strip() required?
'last': instance.last_name.strip(' \t').lower(), #.strip() required?
'ext': filename.split('.')[-1]
}

class Trainer(models.Model):
"""
Trainers and their associated information.
"""
first_name = models.CharField(max_length=25)
last_name = models.CharField(max_length=25)
image = models.ImageField(upload_to=set_path, blank=True, null=True,
verbose_name="Trainer image")
description = models.TextField()

class Meta:
unique_together = ('first_name', 'last_name',)

def clean(self):
super(Trainer, self).clean()
# Are these calls to .strip() applied before the fields
# get used as `instance` to determine a filename?
self.first_name = self.first_name.strip(' \t')
self.last_name = self.last_name.strip(' \t')
self.description = self.description.strip(' \t\r\n')

最佳答案

如果 upload_to 参数有一个可调用函数,它会在模型​​库的 save() 方法期间调用。 save() 当然是在 clean() 之后调用的,因此如果您已经在 clean() 方法中删除了任何字段,则不需要删除任何字段。

Django源码第90行可以看到调用代码的地方:https://code.djangoproject.com/browser/django/trunk/django/db/models/fields/files.py

generate_filename 是指向您传递给 upload_to 的任何内容的存储变量。

所以,顺序是表单提交 -> model.full_clean() -> overridden clean() -> save(),调用 upload_to()

关于django - 在保存 Django 模型实例时,相对于用作 ModelField 属性的方法,我的 clean() 和 save() 覆盖应用的顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com