'Django - Get parent object with children's object

I'm new to Django so I might miss the answer for this one because of terminology.

I am trying to get parent object with children objects, I've got:

#models.py
class Category(models.Model):
    name = models.CharField(max_length=255)
    sub_category = models.ForeignKey(SubCategory)
    title = models.CharField(max_length=255, null=True)


#serializer.py
class CategorySerializer(serializers.ModelSerializer):

    class Meta:
        model = Category
        fields = '__all__'

#views.py
Product.objects.all().filter(sub_category__category_id=category_id).select_related()
products_serializer = ProductSerializer(products, many=True)

    return Response({
        'data': products_serializer.data
    })

I am trying to get parent category object within the children objects I've already got.

Thanks in advance :)



Solution 1:[1]

You already have your parent object, you can access it through each of your objects:

products = Product.objects.all().filter(sub_category__category_id=category_id)
for product in products:
  parent = product.parent  # You already have it

For better performance change your query to

Product.objects.all().filter(sub_category__category_id=category_id).select_related('parent')

As commented you can do it through serializers:

class ProductItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductItem

class ProductSerializer(serializers.ModelSerializer):
    product_items = ProductItemSerializer(many=True, read_only=True)

    class Meta:
        model = Product

class CategorySerializer(serializers.ModelSerializer):
    products = ProductSerializer(many=True, read_only=True)

    class Meta:
        model = Category

Now just get categories and products and items will be nested

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1