Как организовать связь категорий с подкатегориями в сериализаторе rest framework
Я изучаю DRF и хотелось бы получить помощь. У меня есть модели с категориями и подкатегориями, мне бы хотелось выводить в сериализаторе при выборе категории выводились подкатегории относящиеся к этой категории. Такое можно организовать в сериализаторе?
Models:
class CategoryProduct(models.Model):
"""Основная категория"""
name = models.CharField('Название категории', max_length=120)
url = models.SlugField(max_length=160)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Категория продукта'
verbose_name_plural = 'Категории продуктов'
class SubCategoryProduct(models.Model):
"""Подкатегория"""
name = models.CharField('Название подкатегории', max_length=120)
category = models.ForeignKey(CategoryProduct, on_delete=models.CASCADE, verbose_name='Категория подкатегория')
url = models.SlugField(max_length=160)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Подкатегория продукта'
verbose_name_plural = 'Подкатегории продуктов'
serializer:
class CategorySerializers(serializers.ModelSerializer):
class Meta:
model = models.CategoryProduct
fields = ('name',)
class SubCategoryProductSerializers(serializers.ModelSerializer):
# category = CategorySerializers()
class Meta:
model = models.SubCategoryProduct
fields = ('name', 'category')
Сейчас получается какую бы я категорию не выбирал, в подкатегориях получаю весь список. Или это реализуется на frontend. Я пытаюсь на текущий момент реализовать это в форме rest framework при отправке POST запроса.
Как я понял это нужно организовать на Frontend.
Конечно это надо реализовывать на DRF. Задача сводится к тому, что бы отфильтровать SubCategoryProduct по связям с ForeignKey(CategoryProduct. Вам потребуется переписать serializer с использованием SerializerMethodField(). В Вашем случае код будет примерно таким:
class SubCategoryProductSerializer(serializers.ModelSerializer):
class Meta:
model = SubCategoryProduct
fields = '__all__'
class CategorySerializer(serializers.ModelSerializer):
sub_category = serializers.SerializerMethodField()
class Meta:
model = CategoryProduct
fields = ('name', 'sub_category')
def get_sub_category(self, obj):
queryset = SubCategoryProduct.objects.filter(category=obj)
return [SubCategoryProductSerializer(q).data for q in queryset]