Запрос обратного отношения "многие-ко-многим" в Django

В моем django-приложении есть модель категории и модель продукта... модель продукта имеет поле many2many, указывающее на модель категории... и модель продукта имеет поле added, обозначающее, когда она была создана. как мне отфильтровать модель категорий на основе значения поля added для продукта?

class Category(models.Model):
    #this model SHOULD BE managed by the platform admin
    title = models.CharField(max_length=100)
    slug = models.SlugField(blank=True)
    description = models.CharField(max_length=255, blank=True, null=True)
    items_count = models.PositiveIntegerField(null=True, blank=True)
    updated = models.DateTimeField(auto_now=True)
    image = models.ImageField(upload_to='categories_images',help_text='Generic Image describing the category very very well', null=True, blank=True)

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

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save(*args, **kwargs)
class Product(models.Model):
    title = models.CharField(max_length=50)
    image = models.ImageField(upload_to='uploaded_products/', default="products/default_product.png")
    description = models.TextField(max_length=255, null=True, blank=True)
    categories = models.ManyToManyField(Category,related_name='products', blank=True)
    tags = models.ManyToManyField(Tag, blank=True)
    stock = models.PositiveIntegerField(default=1, blank=True)
    added = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    uploader = models.ForeignKey(Account, on_delete=models.CASCADE, blank=True, null=True)

    def __str__(self):
        return self.title

я хочу иметь возможность делать запрос для текущих трендовых категорий на основе добавленного поля продукта.

Мы можем сначала посмотреть для каждого Category когда был самый последний Product, который был добавлен с помощью .alias(…) [Django-doc], или с помощью .annotate(…) [Django-doc] до . Мы аннотируем это следующим образом:

from django.db.models import Max

Category.objects.alias(
    most_recent_change=Max('products__added')
)

Затем мы можем получить объекты с помощью фильтрации. Например, если мы хотим получить только Category, обновленные за последние 24 часа, мы можем фильтровать с помощью:

from datetime import timedelta
from django.db.models import Max
from django.db.models.functions import Now

Category.objects.alias(
    most_recent_change=Max('products__added')
).filter(
    most_recent__gte=Now()-timedelta(days=1)
)

или мы можем использовать метку времени, предоставляемую самим Django:

from datetime import timedelta
from django.utils.timezone import now
from django.db.models import Max

Category.objects.alias(
    most_recent_change=Max('products__added')
).filter(
    most_recent__gte=now()-timedelta(days=1)
)
Вернуться на верх