amine4392
amine4392

Reputation: 99

Django annotate by foreign key

This is my models.py:

class Category(models.Model):
    category_des = models.CharField(max_length=250)

class Type(models.Model):
    type_des = models.CharField(max_length=250)

class Product(models.Model):
    category_id = models.ForeignKey(Category, on_delete=models.CASCADE)
    type_id = models.ForeignKey(Type, on_delete=models.CASCADE)
    product_name = models.CharField(max_length=250)
    product_price = models.FloatField()

What I want to do is to divide products into menus list and extras list and group them by category like this:

Category 1:

extra 1.a

extra 1.b

menu 1.c

menu 1.d

Category 2:

extra 2.e

extra 2.f

menu 2.g

menu 2.h

and this is what I did in views.py:

class MenuList(generics.ListCreateAPIView):
    queryset = models.Product.objects.filter(type_id=1).annotate("category_id")
    serializer_class = serializers.ProductSerializer
    
class MenuDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = models.Product.objects.filter(type_id=1).annotate("category_id")
    serializer_class = serializers.ProductSerializer

class ExtraList(generics.ListCreateAPIView):
    queryset = models.Product.objects.filter(type_id=2).annotate("category_id")
    serializer_class = serializers.ProductSerializer
class ExtraDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = models.Product.objects.filter(type_id=2).annotate("category_id")
    serializer_class = serializers.ProductSerializer

I got this error: TypeError: QuerySet.annotate() received non-expression(s): category_id.

Upvotes: 1

Views: 2865

Answers (1)

Harben
Harben

Reputation: 1856

Query Expressions and F() Objects

Django 3.2 Documentation

class MenuList(generics.ListCreateAPIView):
    queryset = models.Product.objects.filter(type_id=1).annotate(F("category_id"))
    serializer_class = serializers.ProductSerializer

Try and make use of an F() object to add on the category_id to each object in your queryset.

Upvotes: 2

Related Questions