Я работаю над каким-то интернет-коммерческим магазином (только для учебных целей).
У меня есть родительская модель «Категория» и дочерняя модель «Продукт», которая имеет поле «Категория». который ссылается на объект Category с отношениями «многие-к-одному» (ForeignKey).
Идея состоит в том, чтобы сделать фильтрацию из родительского класса, например. Категория для получения всех объектов Product, соответствующих заданным параметрам.
Например: когда я отправляю запрос на маршрутизацию "localhost/api/categories/" " Я получаю все категории и подкатегории (только для более широкого понимания: маршрутизация подкатегорий также работает. Если я отправляю запрос на localhost/api/categories/smartphones/, он возвращает ответ с подкатегориями, которые являются дочерними элементами смартфонов и так далее).
Теперь я хочу реализовать фильтрацию таким образом: когда я отправляю запрос на маршрутизацию "localhost/api/categories/smartphones/brand?=apple " он должен вернуть все объекты Product с полем бренда, равным "apple". И этот шаблон должен работать для любой категории, поэтому мне не нужно жестко кодировать apple как объект Category для каждой отдельной категории, которая может содержать устройства Apple.
Мой код прямо сейчас (не все строки включены, но самое важное):
products/models.py
class Product(models.Model):
"""Model representing a product."""
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=255)
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='products')
brand = models.ForeignKey('Brand', on_delete=models.CASCADE, related_name='products')
slug = models.SlugField(unique=True, blank=True, default=id)
class Brand(models.Model):
"""A model representing the brand of the product."""
id = models.AutoField(primary_key=True, editable=False)
name = models.CharField(max_length=255)
slug = models.SlugField(unique=True, editable=False)
products/serializers.py
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
products/views.py
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
lookup_field = 'slug'
products/urls.py
router = DefaultRouter()
router.register("", ProductViewSet)
urlpatterns = [
path("", include(router.urls)),
]
categories/models.py
class Category(MPTTModel):
""" Category model inherits from a side application class MPTT designed for more
convenient work with model tree structure """
objects = CategoryManager() # Use of a custom manager defined above
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=120, db_index=True, unique=True)
slug = models.SlugField(unique=True)
parent = TreeForeignKey( # MPTT model Field represents a parent of subcategory (if exists) in tree structure.
"self",
blank=True,
null=True,
related_name="child",
on_delete=models.CASCADE
)
categories/serializers.py
class RecursiveField(serializers.Serializer):
def to_representation(self, value):
serializer = self.parent.parent.__class__(value, context=self.context)
return serializer.data
class CategorySerializer(serializers.ModelSerializer):
child = RecursiveField(many=True, read_only=True)
categories/views.py
класс КатегорииAPIViewSet(viewsets.ModelViewSet):
""" Standard ModelViewSet which implements CRUD with minor changes. """
queryset = Category.objects.all()
serializer_class = CategorySerializer
lookup_field = 'slug'
categories/urls.py
router = SimpleRouter()
router.register("", CategoriesAPIViewSet)
urlpatterns += router.urls
Подробнее здесь: https://stackoverflow.com/questions/763 ... -from-a-pa
ДРФ. Фильтрация объектов дочернего класса, связанных с родительским с помощью внешнего ключа, из маршрутизации API родит ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Базовый класс, принимающий аргументы шаблона дочернего класса и внутреннего дочернего класса
Anonymous » » в форуме C++ - 0 Ответы
- 24 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Базовый класс, принимающий аргументы шаблона дочернего класса и внутреннего дочернего класса
Anonymous » » в форуме C++ - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Базовый класс, принимающий аргументы шаблона дочернего класса и внутреннего дочернего класса
Anonymous » » в форуме C++ - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Фильтрация связанных объектов в сериализаторе DRF на основе разрешения пользователя
Anonymous » » в форуме Python - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-