Я хочу фильтровать публичные ленты по нескольким тегам (сохраненным в предпочтениях пользователя).
У меня есть список тегов (предпочтенных пользователем).
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>]