代码之家  ›  专栏  ›  技术社区  ›  user3541631

Django外键Null和unqiue together,加小写

  •  0
  • user3541631  · 技术社区  · 7 年前

    我有一个类别模型,它本身有一个外来项,可以有空值。

    我在网站上找到了一些局部解决方案,但不是很好,也没有涵盖我的所有情况。另一件事,我在模型上做了清理,因为我在管理中有类别,所以我无法控制窗体或视图。

    现在我在“name\uu iexact”上出现了一个错误,我不明白为什么,因为“name==self.name”可以工作。

    "NameError: name '_' is not defined"

    class Category(models.Model):
        name = models.CharField(max_length=255)
        parent = models.ForeignKey('self', blank=True, null=True, verbose_name='parent category')
        description = models.TextField()
    
        def __str__(self):
            return self.name
    
        def clean(self):
            cleaned_data = super().clean()
    
            if not self.parent:
                exists = self.__class__.objects.filter(~Q(pk=self.pk), name__iexact=self.name).exists()
                if exists:
                    raise ValidationError(_('Duplicate Category Name with No Parent'), code='duplicate_no_parent')
            if self.name.lower() == self.parent.name.lower():
                raise ValidationError(_('Category Name the same as Parent Category Name'), code='duplicate_as_parent')
    
            return cleaned_data
    

    name\uu iexact错误:

    Exception Type:     NameError
    Exception Value:    
    
    name '_' is not defined
    
    File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
        response = get_response(request)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
        response = self.process_exception_by_middleware(e, request)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\contrib\admin\options.py", line 551, in wrapper
        return self.admin_site.admin_view(view)(*args, **kwargs)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\utils\decorators.py", line 149, in _wrapped_view
        response = view_func(request, *args, **kwargs)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\views\decorators\cache.py", line 57, in _wrapped_view_func
        response = view_func(request, *args, **kwargs)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\contrib\admin\sites.py", line 224, in inner
        return view(request, *args, **kwargs)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\contrib\admin\options.py", line 1508, in add_view
        return self.changeform_view(request, None, form_url, extra_context)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\utils\decorators.py", line 67, in _wrapper
        return bound_func(*args, **kwargs)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\utils\decorators.py", line 149, in _wrapped_view
        response = view_func(request, *args, **kwargs)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\utils\decorators.py", line 63, in bound_func
        return func.__get__(self, type(self))(*args2, **kwargs2)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\contrib\admin\options.py", line 1408, in changeform_view
        return self._changeform_view(request, object_id, form_url, extra_context)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\contrib\admin\options.py", line 1440, in _changeform_view
        if form.is_valid():
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\forms\forms.py", line 183, in is_valid
        return self.is_bound and not self.errors
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\forms\forms.py", line 175, in errors
        self.full_clean()
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\forms\forms.py", line 386, in full_clean
        self._post_clean()
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\forms\models.py", line 408, in _post_clean
        self.instance.full_clean(exclude=exclude, validate_unique=False)
      File "D:\DevEnv\PythonEnv\Django\lib\site-packages\django\db\models\base.py", line 1234, in full_clean
        self.clean()
      File "D:\DevProj\Learn\Django\ph_work\categories\models.py", line 21, in clean
        raise ValidationError(_('Duplicate Category Name with No Parent'), code='duplicate_no_parent')
    NameError: name '_' is not defined
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Brown Bear    7 年前

    试试看,然后放入完整的错误堆栈

    exists = self.__class__.objects.exclude(pk=self.pk).filter(name__iexact=self.name).exists()
    
        2
  •  0
  •   ViorelD    7 年前

    如果要检查相同的字符串值,我建议使用“is”运算符:

    if self.name.lower() is self.parent.lower()
    

    通过这种方式,您可以测试它们是否共享相同的内存地址,这很好,因为Python在一个内存地址存储具有相同值的字符串。