【问题标题】:Django search in a TextFieldDjango 在 TextField 中搜索
【发布时间】:2018-07-16 18:47:36
【问题描述】:

我正在尝试在 Django 中搜索查询,icontains 查找适用于 title(CharField),但不适用于 content(TextField)。我想搜索查询是否存在于帖子的标题或内容中。

我用来测试查询的模型:(models.py)

class BlogPost(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=120, blank=True)
    content = models.TextField(blank=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '{} - {}'.format(self.title, self.user.username)

这是代码:(views.py)

from django.db.models import Q

...

class BlogPostAPIView(mixins.CreateModelMixin, generics.ListAPIView):

    ...

    def get_queryset(self):
        qs = BlogPost.objects.all()
        query = self.request.GET.get('q')
        if query is not None:
            qs = qs.filter(Q(title__icontains=query) | Q(content__icontains=query)).distinct()
        return qs

这是我在查询时遇到的错误:

异常类型:字段错误

异常值:TextField 的不支持查找“icontains”或不允许加入该字段。

【问题讨论】:

  • 我们能看到你完整的BlogPost模型以及里面的所有方法吗?
  • 使用我用来测试此查询的模型更新了问题。
  • 您确定content 有内容吗?最重要的是,不建议将 null=True 设置为 TextField,因为 None 值可能被视为字符串 "None" 在字段中不为空
  • 为什么不把模型中的字段改成CharField呢?真的没什么区别。
  • 另外,您使用的是哪个数据库?

标签: python django django-models django-queryset


【解决方案1】:

你可以使用

结果 = Cancer.objects.filter(abstract__contains='cancer').values_list('title', 'document_id') str(results.query)

'SELECT "patents_cancer"."title", "patents_cancer"."document_id" FROM "patents_cancer" WHERE "patents_cancer"."abstract"::text LIKE %cancer%'

或 您可以将Search 用于TextField 比如 Entry.objects.filter(body_text__search='Cheese')

https://docs.djangoproject.com/en/2.1/ref/contrib/postgres/search/

【讨论】:

    【解决方案2】:

    将您的字段更改为CharField。正如评论中所解释的,您正在使用 SQLite。 SQLite doesn't pose any length restrictions 在字符字段上。

    【讨论】:

      【解决方案3】:

      你有两个选择来解决这个问题

      1. 将TextField 更改为CharField。这会损害您的文本存储

      2.使用MYSQL,PostgreSQL等数据库

      【讨论】:

      • 我现在正在使用 MySQL,但 Django 仍然强制我使用 max_length 参数,因为它是一个 CharField(如果我改回 TextField 会导致相同的错误),那么是什么在这一点上使用 MySQL 或 SQLite3 的区别?
      猜你喜欢
      • 2021-09-13
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2021-12-18
      • 2015-04-11
      • 1970-01-01
      • 2018-03-27
      • 2014-07-17
      相关资源
      最近更新 更多