用于模型功能的 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。
这取决于您要实现的目标。
如果要在将条目的主体保存到数据库之前将其清理干净,则需要重写保存方法。
如果您对搜索结果感兴趣,那么您可以搜索条目的正文,结果将与搜索清理后的文本相同。
下面代码中的搜索功能搜索具有状态='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)
感谢您的帮助。
我正在尝试通过一个 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。
这取决于您要实现的目标。 如果要在将条目的主体保存到数据库之前将其清理干净,则需要重写保存方法。 如果您对搜索结果感兴趣,那么您可以搜索条目的正文,结果将与搜索清理后的文本相同。
下面代码中的搜索功能搜索具有状态='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)
感谢您的帮助。