Django - Queryset with manytomany related values

With Django, I want to build a queryset with related objects from a ManyToManyField relation. My goal is to aggregate related values in a list, as a group by or string_agg in SQL.

Here is my setup:

models.py

class BaseModel(models.Model):
    id = models.UUIDField( 
         primary_key = True, 
         default = uuid.uuid4, 
         editable = False,
         verbose_name='identifier') 
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='created at')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='last update')

    class Meta:
        abstract = True
        
class Topping(BaseModel):
    name = models.CharField(max_length=100, blank=False, unique=True, verbose_name='topping')

    def __str__(self):
        return self.name
        
class Pizza(BaseModel):
    name = models.CharField(max_length=100, blank=False, verbose_name='nom')
    fk_toppings = models.ManyToManyField(Topping, default=None, related_name='toppings_data', verbose_name='toppings')
    
    def __str__(self):
        return f"{self.name} - {self.fk_toppings}"

views.py

class PizzaView(TemplateView):

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        
        qs = Pizza.objects.all()
        print(qs)
        header = list(qs.values().first().keys())
        print(f"Header: {header}")
        context['pizzas'] = qs
        return context

Returned queryset doesn't display any related objects:

<QuerySet [<Pizza: Margherita - my_app.Topping.None>]>

And header doesn't contains the ManyToManyField field:

Header: ['id', 'created_at', 'updated_at', 'name']

Why fk_toppings isn't here ?

How to get a queryset with a list of related objects like:

<QuerySet [<Pizza: Margherita - (Basil, Mozzarella, Tomato)]>

I found this package, but I'm surprised there isn't any build-in method in Django ORM to make this standard relational operation.

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