Как отсортировать значения qury в Django на основе количества дочерних таблиц?

Здравствуйте, ребята, у меня есть класс Product, у которого есть дочерний класс ProductColors, вот мои два класса :

class Product(models.Model):
    category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    slug = models.SlugField(unique=True, allow_unicode=True)
    description = models.TextField()
    price = models.PositiveIntegerField()
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    discount = models.PositiveIntegerField(default=0)
    offer_end = models.DateTimeField(blank=True, null=True)
    user_likes = models.ManyToManyField(User, related_name="product_likes", blank=True)

и :

class ProductColor(models.Model):
    class ColorChoices(models.TextChoices):
        RED = "#f50b0b","قرمز"
        BLUE = "#0844f3","آبی"
        YELLOW ="#f7f704", "زرد"
        GREEN = "#22f704","سبز"
        PINK = "#f704e8","صورتی"
        PURPLE = "#901f89","بنفش"
        GRAY = "#9c939c","خاکستری"
        WHITE = "#ffffff","سفید"
        BLACK = "#000000","سیاه"
        ORANGE = "#f2780c","نارنجی"
        BROWN =  "#513924","قهوه ای"
        GLASS = "#f3f3f2", "بی رنگ"

    product = models.ForeignKey(Product, related_name='colors', on_delete=models.CASCADE)
    color = models.CharField(choices=ColorChoices.choices, max_length=255)
    quantity = models.PositiveIntegerField(default=0)

    def __str__(self):
        return f"{self.product.name} - {self.color}"

я пытаюсь отсортировать продукты на основе первого - доступного, а затем количество цветов от большего количества к нулю я пытаюсь сделать это с помощью этого метода :

from django.db.models import Count, When, Case, IntegerField


products = Product.objects.all().order_by('-available', 'name')
products = products.annotate(
        has_zero_quantity=Case(
            When(colors__quantity=0, then=1),
            When(colors__quantity__gt=0, then=0),
            output_field=IntegerField(),
        )
    )

но я застрял и не могу найти правильный путь Кто-нибудь может помочь с решением?

я нашел ответ и хочу поделиться с некоторыми людьми, которые могут застрять, как я :

from django.db.models import Prefetch
products = products.filter(available=True).prefetch_related(
        Prefetch('colors', queryset=ProductColor.objects.order_by('-quantity'))
    )

исправьте проблему

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