首页 > 解决方案 > 在网站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 的类似搜索模型逻辑)。

我希望得到模拟结果: 图像

标签: pythondjangosearch

解决方案


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}) 



推荐阅读