我正在尝试在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不支持的查找“包含”或不允许在字段上加入。
答案 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.使用诸如MYSQL
,PostgreSQL
等的数据库