Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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 save()django中的内容是什么_Python_Django_Signals - Fatal编程技术网

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之前,请执行此操作