我有一个Category模型和一个Menu模型,我想显示JSON数据,如下所示:
{
"category":{
"category": "Something",
"menu": [
{
"id": 1,
"dish": "Sample Dish",
"price": 150,
"restaurant": 1
},
{
"id": 1,
"dish": "Sample Dish",
"price": 150,
"restaurant": 1
},
}
}
以下是模型:
class Menu(models.Model):
dish = models.CharField(max_length=250)
category = models.ForeignKey('Menu_Category',on_delete=models.CASCADE,related_name='menu')
price = models.IntegerField()
restaurant = models.ForeignKey('Restaurant',on_delete=models.CASCADE,related_name='menu')
def __str__(self):
return self.dish
class Menu_Category(models.Model):
category = models.CharField(max_length=255,default='')
def __str__(self):
return self.category
class Meta:
verbose_name = 'Menu Category'
verbose_name_plural = 'Menu Categories'
这是序列化器:
class MenuSerializer(serializers.Serializer):
class Meta:
model = Menu
fields =['dish','price','restaurant']
class MenuCategorySerializer(serializers.Serializer):
menu = MenuSerializer(read_only=True,many=True)
class Meta:
model = Menu_Category
fields = ['category','menu']
我也尝试构建一些自定义的嵌套序列化程序,似乎无法正确获取JSON数据。
答案 0 :(得分:0)
您应该能够通过在返回其相关菜单的类别模型上创建属性来执行此操作。仅供参考(您也可以使用self.menu_set.all()
)。参见下面的型号更改
class Menu_Category(models.Model):
category = models.CharField(max_length=255,default='')
def __str__(self):
return self.category
class Meta:
verbose_name = 'Menu Category'
verbose_name_plural = 'Menu Categories'
@property
def menu(self):
return Menu.objects.filter(category=self)
在序列化器中,将序列化器继承更改为ModelSerializer
。除非您在models.py中的属性名称不同于序列化器字段名称
Sources in Rest framework serializers
class MenuCategorySerializer(serializers.ModelSerializer):
menu = MenuSerializer(read_only=True,many=True, source='menu') # -- Source must be the same as declared in models.py property
class Meta:
model = Menu_Category
fields = ['category','menu']
答案 1 :(得分:0)
您必须在id
字段中添加MenuSerializer
,并且可以在序列化程序中将反向关系menu_set
与source
参数一起使用,如下所示
class MenuSerializer(serializers.Serializer):
class Meta:
model = Menu
fields =['id', 'dish','price','restaurant']
class MenuCategorySerializer(serializers.Serializer):
menu = MenuSerializer(read_only=True,many=True, source='menu_set')
class Meta:
model = Menu_Category
fields = ['category','menu']