ДРФ. Фильтрация объектов дочернего класса, связанных с родительским с помощью внешнего ключа, из маршрутизации API родитPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 ДРФ. Фильтрация объектов дочернего класса, связанных с родительским с помощью внешнего ключа, из маршрутизации API родит

Сообщение Anonymous »

Я работаю над каким-то интернет-коммерческим магазином (только для учебных целей).
У меня есть родительская модель «Категория» и дочерняя модель «Продукт», которая имеет поле «Категория». который ссылается на объект 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»