我想将模型嵌套到 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 中关系的名称,因此获得给定 Brand
s =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__'
我想将模型嵌套到序列化程序中。就像在类别列表上一样,应该有来自品牌模型的字段,但是我通过这种方式设置时遇到错误?
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 中关系的名称,因此获得给定 Brand
s =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__'