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.