Поиск с помощью Django (для тегов)

Я выполняю поиск по 3 частям. (1-е имя пользователя 2.подпись 3.тег) Только поиск по 3-му тегу не работает. (Ошибка, которую я получаю, когда добавляю тег
-Related Field got invalid lookup: icontains)

Я также пытался использовать модель Tag, но это не сработало, вы можете помочь?

введите код здесь

myviews.py

@login_required(login_url="login")
def UserSearch(request):
    query = request.GET.get("q")
    context = {}
    specailAd= Ad.objects.order_by('-dateAd')
        
    ads = list(Ad.objects.all())
    oneAd = random.choice(ads)
    post_items = Post.objects.all().order_by('-posted')     
    if query:
        post_items = post_items.filter(caption__icontains = query)

    if query:
        post_items = post_items.filter(tags__icontains = query)
        
    if query:
        users = User.objects.filter(Q(username__icontains=query))

        #Pagination
        paginator = Paginator(users, 6)
        page_number = request.GET.get('page')
        users_paginator = paginator.get_page(page_number)

        context = {
                'users': users_paginator,
                'post_items':post_items,
                'specailAd':specailAd,
                'oneAd':oneAd,
            }
        
    template = loader.get_template('direct/search_user.html')

mymodels.py

class Post(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    content =  models.ManyToManyField(PostFileContent, related_name='contents')
    caption = models.TextField(max_length=1500, verbose_name='Caption')
    posted = models.DateTimeField(auto_now_add=True)
    tags = models.ManyToManyField(Tag, related_name='tags')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    likes = models.ManyToManyField(
        User, related_name='like', default=None, blank=True)
    like_count = models.BigIntegerField(default='0')


    def get_absolute_url(self):
        return reverse('postdetails', args=[str(self.id)])

    def __str__(self):
        return str(self.id)

class Tag(models.Model):
    title = models.CharField(max_length=75, verbose_name='Tag')
    slug = models.SlugField(null=False, unique=True)

    class Meta:
        verbose_name='Tag'
        verbose_name_plural = 'Tags'

    def get_absolute_url(self):
        return reverse('tags', args=[self.slug])
        
    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        return super().save(*args, **kwargs)

Вам нужно использовать tags__in вместо tags__icontains.

post_items = post_items.filter(tags__icontains = list_of_tags_from_query)

Вы не можете использовать icontains в отношениях m2m, вместо этого вы должны использовать другое двойное подчеркивание для значения, которое вы хотите проверить, имеет icontains, например, имя или другое поле:

post_items = post_items.filter(tags__name__icontains=query)

В качестве дополнения, ваши три if-заявления выполняют одно и то же действие, поэтому вы могли бы объединить их вместе.

Вернуться на верх