API категории для товаров django
У меня есть две модели: Категория, Продукты. И я хочу создать отдельную url ссылку типа http://127.0.0.1:8000/api/categories/sneakers для каждой категории, чтобы получать продукты с разных url. Используя внешний ключ, я могу разделить их, но не знаю, как дать им url. Не могли бы вы помочь мне с этим?
Одним из решений является регистрация URL с заполнителем, который присваивает часть пути переменной:
# urls.py
urls = [
path('api/categories/<string:category>', views.product_by_category, name=product_by_category)
]
Теперь django будет посылать category
параметр в ваше представление, который вы можете использовать для получения нужных вам продуктов:
# views.py
def product_by_categor(request, category):
# get the products and serialize them as JSON or render a template to HTML
pass
Вам необходимо заменить pass
на соответствующую логику, чтобы вернуть правильный ответ.
Вы можете сделать примерно следующее:
Например:
Ваш models.py
class Category(models.Model):
name = models.CharField(max_length=50, unique=True)
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=50, unique=True)
price = models.IntegerField()
brand = models.CharField(max_length=20)
category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)
barcode = models.IntegerField(default=None, validators=[MinValueValidator(10000000), MaxValueValidator(99999999)], unique=True)
image = models.CharField(max_length=264)
def __str__(self):
return self.name
Ваш serializers.py
class ProductListSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ('id', 'name')
class ProductDetailSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ('id', 'name', 'price', 'brand', 'category', 'barcode', 'image')
depth = 1
class CategoryListSerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ('id', 'name')
class CategoryDetailSerializer(serializers.ModelSerializer):
products = ProductDetailSerializer(many=True)
class Meta:
model = Category
fields = ('id', 'name', 'products')
Ваш views.py
class CategoryListAPIView(generics.ListAPIView):
queryset = Category.objects.all()
serializer_class = serializers.CategoryListSerializer
class CategoryDetailAPIView(generics.RetrieveAPIView):
queryset = Category.objects.all()
serializer_class = serializers.CategoryDetailSerializer
lookup_field = 'name'
class ProductListAPIView(generics.ListAPIView):
queryset = Product.objects.all()
serializer_class = serializers.ProductListSerializer
class ProductDetailAPIView(generics.RetrieveAPIView):
queryset = Product.objects.all()
serializer_class = serializers.ProductDetailSerializer
lookup_field = 'name'
Ваш urls.py
urlpatterns = [
path('categories/', views.CategoryListAPIView.as_view(), name='category-list'),
path('categories/<str:name>', views.CategoryDetailAPIView.as_view(), name='category-detail'),
path('products/', views.ProductListAPIView.as_view(), name='product-list'),
path('products/<str:name>', views.ProductDetailAPIView.as_view(), name='product-detail'),
]