Я хочу вложить модель в Serialiazer. У объекта 'Category' нет атрибута 'brand_set'

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

models.py

class Category(models.Model):
    title = models.CharField(max_length=50)
    timestamp = models.DateTimeField(auto_now_add=True)
    #....


class Brand(models.Model):
    title = models.CharField(max_length=50)
    category = models.ForeignKey(
        Category, blank=True, null=True, on_delete=models.SET_NULL, related_name="category")
    #....

Serializers

class CategorySerializerNested(serializers.ModelSerializer):
    brands = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Category
        fields = '__all__'

    def get_brands(self, obj):
        brands = obj.brand_set.all() #this thin popping error how to fix that....
        serializer = BrandSerializerNested(brands, many=True)
        return serializer.data


class BrandSerializerNested(serializers.ModelSerializer):
    products = serializers.SerializerMethodField(read_only=True)

    def get_products(self, obj):
        products = obj.product_set.all()
        serializer = ProductSerializer(products, many=True)
        return serializer.data

    class Meta:
        model = Brand
        fields = '__all__'

View.py

@api_view(['GET'])
def getCategoryWithBrands(request, pk):
    category = Category.objects.get(id=pk)
    serializer = CategorySerializerNested(category, many=False)
    return Response(serializer.data)

url.py

path('nested/<str:pk>/', views.getCategoryWithBrands,
         name="category-with-brands"),

Ошибка:

AttributeError: 'Category' object has no attribute 'brand_set'
[02/Feb/2022 03:24:49] "GET /api/v1/categories/nested/1/ HTTP/1.1" 500 125121 

Я уверен, что делаю что-то нелогичное, но я не знаю, пожалуйста, помогите мне исправить это, если есть лучший способ сделать это, пожалуйста, помогите и там. Спасибо

Поскольку вы указали related_name='category', вы получите связанные Brand с:

def get_brands(self, obj):
    brands = obj.category.all()
    serializer = BrandSerializerNested(brands, many=True)
    return serializer.data

Но это не имеет особого смысла: related_name=… [Django-doc] указывает имя отношения в reverse, поэтому получая Brand для данного Category, вы можете переименовать их в:

class Brand(models.Model):
    category = models.ForeignKey(
        Category,
        blank=True,
        null=True,
        on_delete=models.SET_NULL,
        related_name='brands'
    )
    #…

и работать с субсериализатором:

def get_brands(self, obj):
    brands = obj.brands.all()
    serializer = BrandSerializerNested(brands, many=True)
    return serializer.data

или просто определите сначала BrandSerializerNested и используйте:

class CategorySerializerNested(serializers.ModelSerializer):
    brands = serializers.BrandSerializerNested(read_only=True)

    class Meta:
        model = Category
        fields = '__all__'
Вернуться на верх