Hello All,
View:
class ProductViewByCategoryByDetails(generics.RetrieveUpdateDestroyAPIView):
serializer_class = serializers.ProductSerializer
def get_queryset(self):
category_id = self.kwargs['pk']
product_id = self.kwargs['product_id']
# Retrieve the category object or raise 404 if not found
category = get_object_or_404(models.Category, pk=category_id)
print(category)
# Filter products based on both category and product id
queryset = models.Product.objects.filter(category=category, id=product_id)
print(queryset)
return queryset
Serializer:
class ProductSerializer(serializers.ModelSerializer):
category = serializers.CharField(source = 'category.category_name')
class Meta:
model = models.Product
fields = "__all__"
def create(self, validated_data):
category = validated_data.pop('category') # Get the category name from validated data
try:
category_object = models.Category.objects.get(category_name=category['category_name'])
except models.Category.DoesNotExist:
raise serializers.ValidationError(f'Category "{category['category_name']}" does not exist. Please add the category first.')
product = models.Product.objects.create(category=category_object, **validated_data)
return product
def update(self, instance, validated_data):
if 'category' in validated_data.keys():
category = validated_data.pop('category')
try:
category_object = models.Category.objects.get(category_name=category['category_name'])
except models.Category.DoesNotExist:
raise serializers.ValidationError(f'Category "{category['category_name']}" does not exist. Please add the category first.')
instance.category = category_object
else:
instance.category = validated_data.get('category', instance.category)
instance.product_name = validated_data.get('product_name', instance.product_name)
instance.description = validated_data.get('description', instance.description)
instance.price = validated_data.get('price', instance.price)
instance.stock = validated_data.get('stock', instance.stock)
instance.save()
return instance
Model:
class Product(models.Model):
id = models.AutoField(primary_key=True)
product_name = models.CharField(max_length=300)
description = models.CharField(max_length=1000)
price = models.FloatField()
stock = models.IntegerField()
category = models.ForeignKey(Category, related_name='category', on_delete= models.CASCADE)
def __str__(self):
return self.product_name
urls:
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from ecommerce_app.api.views import ProductView, CategoryView, ProductViewset, ProductViewByCategory, ProductViewByCategoryByDetails
routers = DefaultRouter()
routers.register('category',CategoryView, basename='category')
routers.register('',ProductViewset, basename='product')
urlpatterns = [
path('',include(routers.urls)),
path('category/<int:pk>/products/',ProductViewByCategory.as_view(), name='product_by_category'),
path('category/<int:pk>/products/<int:product_id>/',ProductViewByCategoryByDetails.as_view()),
]
Above is my when try to hit ‘category/int:pk/products/int:product_id/’ getting error “No Product matches the given query.” but have product in database and I am getting out put in shell.
>>> product = Product.objects.get(pk=5, category__category_name='Electronics')
>>> print(product)
Test
>>> print(product.id)
5
when hit same end point for product id 1 am getting output let attach screenshots,
but when hit for product id 5 no output,
logs:
Electronics
<QuerySet [<Product: Ultra HD Smart TV>]>
[12/Jul/2024 06:26:58] "GET /products/category/1/products/1/ HTTP/1.1" 200 12132
Electronics
<QuerySet [<Product: Test>]>
Not Found: /products/category/1/products/5/
[12/Jul/2024 06:27:41] "GET /products/category/1/products/5/ HTTP/1.1" 404 11700
So please review and help me where I am doing wrong here