Python save()django中的内容是什么
我试图理解该方法,因为我遇到了以下错误:Python save()django中的内容是什么,python,django,signals,Python,Django,Signals,我试图理解该方法,因为我遇到了以下错误: @receiver(post_save, sender=Company) def rename (sender, instance, update_fields, **kwargs): new_name='abc' instance.image_file.name = new_name instance.image_file.save() save至少接受给定的3个参数1 因此,我用一个图像字段和一个名称字段重命名了模型
@receiver(post_save, sender=Company)
def rename (sender, instance, update_fields, **kwargs):
new_name='abc'
instance.image_file.name = new_name
instance.image_file.save()
save至少接受给定的3个参数1
因此,我用一个图像字段和一个名称字段重命名了模型中的一个字段
我有一个模型,您可以在其中上载图像,文件名将是字段的名称:
class SomeModel(models.Model):
name = models.CharField(max_length=100)
image_file = models.FileField(upload_to='renaming')
因此,当我通过信号使用save方法时,我得到以下错误:
@receiver(post_save, sender=Company)
def rename (sender, instance, update_fields, **kwargs):
new_name='abc'
instance.image_file.name = new_name
instance.image_file.save()
因此,我填写instance.image\u file.savenew\u name,instance,save=True,而不是instance,我应该填写
但那是什么?具体内容是什么。顺便说一句,instance.save也不起作用,它会创建无限循环
顺便说一句,instance.save也不起作用,它会创建无限循环
这和它应该的完全一样,在代码中某个地方的模型实例上调用save方法后,会触发信号。现在,在post_save信号接收器中,您将再次调用save。然后将保存该对象,并触发另一个post_save信号。然后将对象再次保存在信号接收器中,然后
如果要更改保存到数据库中的内容,应点击pre_save(预保存)信号。或者您应该重写SomeModel保存方法
class SomeModel(models.Model):
def save(self, *args, **kwargs) :
logger = logging.getLogger(__name__)
logger.debug("using custom save")
super(SomeModel, self).save(*args, **kwargs)
使用一个或另一个,但不能同时使用两个。使用预保存信号以防止最大重复超出异常
from django.db.models import pre_save
@receiver(pre_save, sender=Company)
def rename (sender, instance, update_fields, **kwargs):
new_name = 'abc'
instance.image_file.name = new_name
# instance.save() # this line is covered by django, so drop it from here
还请注意,您必须随机创建一个新的\u名称,否则每次保存新公司对象时,图像文件名都会被替换image\u字段只是某个模型上的一个字段,而不是按字段保存,而是保存对象。因此,您需要instance.save而不是instance.image\u field.save有趣的是,您提供的链接提供了问题的答案。它解释了所有的参数。遗憾的是,我不理解它,因此question@Gocht文件字段可以通过它们的方法持久化。好吧,我显然不明白,如果我在实例中使用它。保存它将创建一个无限循环?!另外,如果我使用它,它会更改admin视图中的文件名,但不会更改Datasse中的文件名。如果我单击具有新名称的图像,它将打开一个空页面确定,很抱歉,请从那里删除instance.save。我只记得如果使用pre_save信号,就不需要手动调用save方法;这意味着:使用pre_save信号,更改image_file.name,就这样。Django会帮你保存的。是的,但不是在数据库中,如果我用新名字点击链接,它会导致一个空页面?!我不确定您的意思,但这不会更改我的文件名。我正在向您展示如何重写save方法或使用pre_save来更改任何表字段。在这里,您可以根据需要更改文件名。在调用superSomeModel、self.save*args、**kwargs之前,请执行此操作