用于模型功能的 Django 过滤器

Django Filter for Model function

我正在尝试通过一个 TextField 进行过滤,我在其中删除了它的 HTML 标签。但是,它给了我这个错误:“无法将关键字 'search' 解析为字段。”这是我的代码:

models.py

class Entry(models.Model):
  body = models.TextField()
  
  def search_body(self):
    tags = re.compile('<.*?>')
    cleantext = re.sub(tags, '', self.body)
    return cleantext

views.py

from django.db.models import Q
from .models import Entry
...

def search_list(request, query=None):
  search = "search"
  entrys = Entry.objects.filter(status="publish").filter(Q(search_body__icontains=search)).distinct()

有办法吗?

你不能这样,至少不能这样。

首先,search_body 需要定义为 @property,因为您想将其视为一个。

主要是,Django 不支持对属性进行过滤,因为它需要弄清楚如何将它们变成 SQL。

您可以查看:https://pypi.org/project/django-property-filter/

这取决于您要实现的目标。 如果要在将条目的主体保存到数据库之前将其清理干净,则需要重写保存方法。 如果您对搜索结果感兴趣,那么您可以搜索条目的正文,结果将与搜索清理后的文本相同。

下面代码中的搜索功能搜索具有状态='publish' 且正文中包含单词'search' 的条目。在这两种情况下,Django 都会 return 你使用相同的 Entry 对象的 QuerySet。

models.py

class Entry(models.Model):
  body = models.TextField()
  
  @property
  def clean_text(self):
    tags = re.compile('<.*?>')
    cleantext = re.sub(tags, '', self.body)
    return cleantext

views.py

from django.db.models import Q
from .models import Entry
...

def search_list(request, query=None):
  search = "search"
  entrys = Entry.objects.filter(status="publish", body__icontains=search).distinct()

我刚刚找到了实现目标的方法。 我所要做的就是覆盖“保存”功能,如下所示:

    def save(self, *args, **kwargs):
        self.search_body = clean_text(self)
        super().save(*args, **kwargs)

感谢您的帮助。