Я хочу фильтровать публичные ленты по нескольким тегам (сохраненным в предпочтениях пользователя).

У меня есть список тегов (предпочтенных пользователем).

tags_list = ["animals", "city", "chemicals", "Wealth Management", "Crypto", "Stocks"]

и модель Feed и ее теги

class FeedModel(models.Model):
    
    entity_id = models.BigAutoField(primary_key=True)
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
    title = models.CharField(max_length=250)
    image_url = models.TextField(null=True)
    description = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

# mostly 5 tags per feed
class NewsTags(models.Model):
    id = models.BigAutoField(primary_key=True)
    feed = models.ForeignKey(FeedModel, on_delete=models.CASCADE, related_name='tags')
    tag = models.CharField(max_length=100) # animals, city, finance,...

Я хочу фильтровать фиды по заданным тегам и упорядочить по created_at. Таким образом, мое требование - отфильтрованный фид должен быть сверху, а остальные фиды ниже отфильтрованного фида также с order_by created_at.

q = Q()
for tag in tags_list:
    q |= Q(tags__tag__icontains=tag)

q1 = Q(*remaining feed apart from filtered by the tags*)

_feeds = FeedModel.objects.filter(q|q1).order_by("created_at")

Как я могу получить данные фида, отфильтрованные по тегам, например, Facebook, Instagram фид по поведению пользователя,... Пожалуйста, ответьте, как я могу сделать это лучше всего?

Я думаю, что для этих целей можно использовать django-taggit.

Пакет также поддерживает фильтрацию:

from django.db import models

from taggit.managers import TaggableManager

class Food(models.Model):
    # ... fields here

    tags = TaggableManager()

>>> Food.objects.filter(tags__name__in=["delicious", "red"])
[<Food: apple>, <Food: apple>]
Вернуться на верх