Подключить сериализатор API вложенных моделей django rest framework

avatar
lakshay kumar
8 апреля 2018 в 08:07
309
0
0

Я хочу добиться этого: API для получения всех продуктов для категории.

Models.py

class Category(models.Model):
    main_category = models.CharField(max_length=200, default = '')

    def __str__(self):
        return '%s' % (self.main_category)

class Subcategory(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    sub_category = models.CharField(max_length=200, default = '')

    def __str__(self):
        return '%s' % (self.sub_category)

class Products(models.Model):
    sub_category = models.ForeignKey(Subcategory, on_delete=models.CASCADE)
    product_name = models.CharField(max_length=200, default = '')

    def __str__(self):
        return '%s' % (self.product_name)

Views.py

class ProductCategoryFilter(django_filters.FilterSet):
    category = django_filters.CharFilter(name="category__main_category")

    class Meta:
        model = Products
        fields = ['category']

class ProductCategoryListAPIView(ListAPIView):

    queryset = Products.objects.all()
    serializer_class = ProductCategorySerializer
    filter_class = ProductCategoryFilter

Serializers.py

class ProductCategorySerializer(ModelSerializer):

    #category_name = serializers.CharField(source='category.main_category')
    category_name = CategorySerializer(source='category_set')
    class Meta:
        model = Products
        fields = [
        'category_name',
        'product_name',
        ]

AttributeError в /api/productcategories/

Я получаю AttributeError при попытке получить значение для поля category_name в сериализаторе ProductCategorySerializer. Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре Products.

Исходный текст исключения: Объект "Продукты" не имеет атрибута "категория".

И я хочу, чтобы результат был таким:

[
{
    "category_name": "main category 1",
    "product_name": "product 1"
},
{
    "category_name": "main category 1",
    "product_name": "product 2"
},..........

ИЛИ выводить так:

[
{
   "main category 1" :{ "product 1", "product 2"...}
Источник
Shaumux
8 апреля 2018 в 11:32
0

Когда вы получили ошибку атрибута? Что ты пытался сделать?

lakshay kumar
8 апреля 2018 в 12:29
0

Я пытался получить прямую выходную связь между моделью категории и моделью продукта, не показывая поля модели подкатегории.

lakshay kumar
8 апреля 2018 в 12:44
0

Один человек ответил на это на портале facebook hastebin.com/pafugudimi.scala

lakshay kumar
8 апреля 2018 в 12:45
0

и фильтрацию можно выполнить следующим образом: hastebin.com/misepeqada.py

Ответы (0)