【问题标题】:Error with Signals Post_Save and Pre_Save: created and self! how to fix?信号 Post_Save 和 Pre_Save 出错:created 和 self!怎么修?
【发布时间】:2017-05-02 11:17:27
【问题描述】:

需要增加系列后的数量 如果管理员忘记添加该系列,则会自动添加 以这种方式添加:我们取最后一个创建的系列,从那里我们取 系列号,并添加系列 1 的编号,并添加 到我们的系列!但不断vylazyut这样的错误:

1) 缺乏

参数“self”,添加它(尽管它为什么存在,但它不是 已知)但仍然无法正常工作!

这是我的模型和信号

class Series(models.Model):
    id                                          = models.AutoField(primary_key=True)
    rus_name                                    = models.CharField(max_length=60) 
    eng_name                                    = models.CharField(max_length=60) 
    slug                                        = models.SlugField(unique=False) 
    serial_of_this_series                       = models.ForeignKey(Serial, on_delete=models.CASCADE, default=True)
    season_of_this_series                       = models.ForeignKey(Season, on_delete=models.CASCADE, default=True)
    number_of_series                            = models.IntegerField(default=0, blank=True, null=True)
    description                                 = models.TextField(max_length=700, blank=True, default=None)
    size_of_torent_file                         = models.CharField(max_length=60, default=None)
    link_for_dowloand_serie_in_quality_360p     = models.CharField(max_length=60, default=None)      
    link_for_dowloand_serie_in_quality_720p     = models.CharField(max_length=60, default=None)      
    link_for_dowloand_serie_in_quality_1080p    = models.CharField(max_length=60, default=None)      
    rating                                      = models.FloatField(default=0, blank=True)  
    is_active                                   = models.BooleanField(default=True)
    timestamp_rus                               = models.DateField(auto_now_add=True, auto_now=False)
    updated                                     = models.DateTimeField(auto_now_add=False, auto_now=True)
    timestamp_eng                               = models.CharField(max_length=60) 
    time_of_series                              = models.DecimalField(max_digits=10, decimal_places=2, default=42)



    def get_absolute_url(self):
        return reverse('series:post_of_serie', kwargs=
                      {'serial_slug': self.serial_of_this_series.slug,
                       'season_slug': self.season_of_this_series.slug,
                       'series_slug': self.slug})

    def __str__(self):
        return "%s | %s" % (self.rus_name, self.number_of_series)


    class Meta:
        ordering                                = ["-timestamp_rus"]
        verbose_name                            = 'Series'
        verbose_name_plural                     = 'Series'


def series_change_number(sender, **kwargs):
    ser                                         = Series.objects.last()
    change                                      = ser.number_of_series
    number                                      = int(change) + 1
    series                                      = Series
    series.number_of_series                     = number
    series.save(force_update=True)

pre_save.connect(series_change_number, sender=Series)

【问题讨论】:

  • 删除 series_change_number 函数中的“created”参数。
  • save() 缺少 1 个必需的位置参数:'self'
  • 你想在你的函数中创建一个新的 Series 对象还是就地更新同一个对象?
  • 我需要更新,也就是更新序列号,没关系,我们取之前创建的序列号,给我们的模型加1,这样,当保存管理员,会有对应的序列号!
  • 在下面查看我的答案

标签: django django-models django-signals


【解决方案1】:

好的,这样做:

def series_change_number(sender, instance, **kwargs):
    ser = Series.objects.last()
    change = ser.number_of_series
    number = int(change) + 1
    instance.number_of_series = number

pre_save.connect(series_change_number, sender=Series)

前提是您要更新新的模型对象。

【讨论】:

  • 您的答案出现新错误“超出最大递归深度”
  • 这条线再次调用了 pre_save 信号,因此出现了最大深度问题
  • 你真是个天才,非常感谢)这样的另一个问题,如果你允许的话)如何取最后一个创建的,即高于一切的那个,然后取最多的1创建,结果是最后一个,我尝试使用“first()”方法但不是 Works,他总是创建 1 并添加到它 1 并且有必要他使用最后创建的系列,并从那里获取系列数!非常感谢)
  • 你的下一个问题有点混乱。你能详细说明一下吗?
  • 假设管理面板有2个条目,这些是2个系列,他添加的时候取1个系列,也就是创建最多的一个,也就是老的那个,并且到下一个的数字不会对,但是必须要他取最后一个创建的,也就是不是1系列,也就是1的系列,最后添加的
【解决方案2】:

请不要这样排列你的代码;它使阅读变得非常困难。

您的问题在这里(删除空格):

series = Series

这只是使 series 成为 Series 类的另一个名称。你永远不会实例化它;为此,您需要实际调用它。

series = Series()

...假设这实际上是您想要做的;从您的代码中不清楚。

【讨论】:

  • 好的,怎么做?能帮帮新人吗?我得到了新的错误@maximum recursion depth exceeded@ 这个“series=Series()”
  • 正如我所说,您需要准确解释您要做什么。创建新系列时会调用此代码。您是否尝试更新导致信号被调用的实例上的编号?
  • @DanielRoseman 我认为他正在寻找的是更新当前保存的数据库模型的 number_of_series wrt last saved objects。
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 2021-04-09
  • 2010-11-16
  • 2017-04-26
  • 2018-08-09
  • 2014-03-16
  • 2013-07-14
  • 1970-01-01
相关资源
最近更新 更多