【问题标题】:django calls validate_unique twice - workaround?django 两次调用 validate_unique - 解决方法?
【发布时间】:2014-02-06 11:06:27
【问题描述】:

我知道 validate_unique 仅在执行 full_clean 时被调用,而后者仅在调用 ModelForm.save() 时被调用 - 这意味着在执行 model_instance.save() 时不会自动调用 validate_unique

例如。看到这个答案:https://stackoverflow.com/a/14472335/996792

我确实想在调用model_instance.save 时调用validate_unique,所以我重写了我模型的save 函数,如下所示:

def save(self, *args, **kwargs):
    self.validate_unique()
    super(MyModel, self).save(*args, **kwargs)

但是,这会产生以下怪癖:现在从ModelForm 保存时(例如在管理员中),validate_unique 被调用了两次!大概一次用于ModelForm.save(),一次用于Model.save()。

是否存在这种低效率问题?

我讨厌不必要的垃圾,这种事情困扰着我。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    这是一种可能的解决方法:

    clean(方法在请求来自modelform时被调用,当这个方法被调用时设置一个标志:

    def clean( self ):
        self.clean_called = True   #<---- this is the flag.
        #other model checks
    

    覆盖save( 我只在未设置标志时才调用validate_unique。不要忘记删除标志。

    def save(self, *args, **kwargs):
        flag_is_set = hasattr( self, 'clean_called' ) and self.clean_called
        if not flag_is_set:
            self.validate_unique()
        super(MyModel, self).save(*args, **kwargs)
        self.clean_called = False
    

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 2016-06-26
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多