我想将模型嵌套到 Serialiazer 中。类别对象没有属性 'brand_set'

I want to nest a model into the Serialiazer. Category' object has no attribute 'brand_set'

我想将模型嵌套到序列化程序中。就像在类别列表上一样,应该有来自品牌模型的字段,但是我通过这种方式设置时遇到错误?

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")
    #....

序列化程序

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<strong>.category.all()</strong>
    serializer = BrandSerializerNested(brands, many=True)
    return serializer.data

但这没有多大意义:related_name=… [Django-doc] 指定 reverse 中关系的名称,因此获得给定 Brands =14=],因此您可以将它们重命名为:

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

并使用子序列化器:

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

或者先定义BrandSerializerNested然后使用:

class CategorySerializerNested(serializers.ModelSerializer):
    brands = serializers.<strong>BrandSerializerNested(read_only=True)</strong>

    class Meta:
        model = Category
        fields = '__all__'