# 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 =汽车,红色,我会收到标有汽车,红色的帖子。很好。但是当q = red时,我得到的汽车标签为car,红色,而飞机标签为红色,而不是car,标签为红色。这是不对的。我正在尝试进行精确搜索。您能否分享您的经验并告诉我错误是什么。 (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})