【问题标题】:Django Filter for Model function模型功能的 Django 过滤器
【发布时间】:2021-04-22 20:12:46
【问题描述】:

我正在尝试通过一个 TextField 进行过滤,我已经将它的 HTML 标记剥离了。但是,它给了我这个错误:“无法将关键字'搜索'解析为字段。”这是我的代码:

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 中的search。您的字段仅称为 body
  • 糟糕。我忘了把 models.py 中的搜索改回来。我更新了代码。

标签: python django search


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    下面代码中的搜索功能会搜索 status='publish' 且正文中包含“search”一词的条目。在这两种情况下,Django 都会返回相同的 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()
    

    【讨论】:

    • 感谢您的提示。我试图用代码瞄准的是这个。如果我将正文设为&lt;p&gt;&lt;/p&gt;,然后搜索“p”,我不希望显示此条目。所以我试图过滤一个没有 HTML 标签的正文。
    【解决方案3】:

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

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

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2017-06-22
      • 2013-03-16
      相关资源
      最近更新 更多