Django在TextField中搜索

时间:2018-07-16 18:47:37

标签: python django django-models django-queryset

我正在尝试在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

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

  

异常类型:FieldError

     

异常值:TextField不支持的查找“包含”或不允许在字段上加入。

3 个答案:

答案 0 :(得分:1)

您可以使用

  

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

     

'SELECT“ patents_cancer”。“ title”,“ patents_cancer”。“ document_id”来自“ patents_cancer”,“ patents_cancer”。“抽象” :: text like%cancer%'

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您有两种选择来解决这个问题

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

2.使用诸如MYSQLPostgreSQL等的数据库