python - 在网站django2.2上搜索
问题描述
# my models.py
class Post(models.Model):
image = models.ImageField(upload_to=get_timestamp_path, verbose_name='Изображение')
author = models.ForeignKey(AdvUser, on_delete=models.CASCADE, verbose_name='Автор')
created_at = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Опубликовано')
tags = models.ManyToManyField(
'main.Tag'
)
@property
def tags_list(self):
return ', '.join(self.tags.values_list('name', flat=True).all())
def __str__(self):
return f"{self.image}: {self.tags_list}"
class Meta:
verbose_name_plural = 'Посты'
verbose_name = 'Пост'
ordering = ['-created_at']
class Tag(models.Model):
name = models.CharField(max_length=15, verbose_name='Тег')
created_at = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Опубликовано')
def __str__(self):
return self.name
class Meta:
verbose_name_plural = 'Теги'
verbose_name = 'Тег'
ordering = ['-created_at']
# my views.py
from django.db.models import Q
def get_filter(q):
filter_ = Q()
if q is not None:
# this is an invalid logic:
filter_ = Q(tags__in=Tag.objects.filter(name__in=q.split(',')))
#
return filter_
def index(request):
q = request.GET.get('q')
if q:
posts = Post.objects.filter(get_filter(q)).distinct()
else:
posts = Post.objects.all()
paginator = Paginator(posts, 10)
page_number = request.GET.get('page')
posts = paginator.get_page(page_number)
return render(request, 'main/home.html', {'q': q, 'posts': posts})
如果 q = car, red 我收到一个带有标签 car, red 的帖子。很好。但是当 q = red, car 我得到一个带有标签 car, red 的帖子和带有标签飞机的帖子,红色,而不是带有标签 car, red 的帖子。这是不对的。我正在尝试进行精确搜索。您能否分享您的经验并告诉我错误是什么。(pornhub 和 rule34 的类似搜索模型逻辑)。
解决方案
def index(request):
q = request.GET.get('q')
if q:
q = request.GET.get('q').split()
posts = Post.objects.filter(tags__name=q[0])
for i in q[1:]:
posts = posts.filter(tags__name=i)
else:
posts = Post.objects.all()
paginator = Paginator(posts, 10)
page_number = request.GET.get('page')
posts = paginator.get_page(page_number)
return render(request, 'main/home.html', {'q': q, 'posts': posts})
推荐阅读
- mysql - 有没有办法在不增加休眠日志级别的情况下找出哪个表导致“键 PRIMARY 的重复条目”?
- sql - MSG 537:传递给 LEFT 或 SUBSTRING 函数的长度参数无效
- r - 通过 R 中的蒙特卡罗模拟进行简单的美式期权定价 - 结果太高
- python - 条件等高线图
- javascript - 将时间戳转换为 MM DD、YYYY,反之亦然,无需任何 npm
- python - python在csv中打开第一行,然后仅将剩余行保存在同一个csv文件中
- javascript - 这个函数是递归的吗?
- ethereum - 当以太坊网络是公共(非私有)区块链时,它如何遵守欧盟的 GDPR
- java - 尝试 StartActivity 时出现 Java Lang 异常
- codeigniter - Codeigniter 查询绑定具有相同值的多个字段