django - 使用 Django Rest Framework 序列化相关枢轴模型
问题描述
我正在学习 Django,并且正在使用 Django Rest Framework。在我的应用程序中,我有三种不同的模型
- 酒吧(保存有关酒吧的信息,通过 BarBeer 模型拥有多种啤酒)
- 啤酒(保存有关啤酒的信息)
- BarBeer(酒吧和啤酒之间的连接,具有酒精、类型、价格和数量等枢轴字段)
这是定义不同模型的方式:
class Bar(models.Model):
name = models.CharField(max_length=60)
location = models.PointField()
address = models.CharField(max_length=60)
description = models.TextField(default='')
beers = models.ManyToManyField('api.Beer', through='api.BarBeer')
class Beer(models.Model):
name = models.CharField(max_length=60)
alcohol = models.FloatField(default=0)
class BarBeer(models.Model):
bar = models.ForeignKey(Bar, on_delete=models.CASCADE)
beer = models.ForeignKey(Beer, on_delete=models.CASCADE)
price = models.FloatField(default=0)
type = EnumField(Type, default=Type.Cask)
volume = models.IntegerField(default=0)
现在我想用该特定酒吧的所有啤酒序列化一个给定的酒吧,包括枢轴模型中的额外字段BarBeer
。例如,下面是我想要的输出(注意啤酒上额外的三个字段,来自 BarBeer 模型):
{
"id": 1,
"name": "A bar",
"beers": [
{
"id": 1,
"name": "Ship Full of IPA",
"alcohol": 6.5,
"type": "bottle",
"price": "35",
"volume": "33"
}
]
}
我不知道如何从数据透视模型中获取额外字段作为序列化输出的一部分。这就是我的序列化程序现在的样子:
class BarDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = Bar
fields = ('id', 'name', 'beers')
depth = 3
解决方案
首先beers = models.ManyToManyField('api.Beer', through='api.BarBeer')
这个字段是不必要的,因为你已经创建了一个名为BarBeer
. ManyToManyField 意味着添加额外的表。所以,如果我们假设这个字段不存在而你有BarBeer table
,你可以使用BarBeerSerializer
这样的方法来做到这一点:
序列化程序.py
class BarBeerSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField()
alchol = serializers.SerializerMethodField()
class Meta:
model = BarBeer
fields = ['id','name','alchol','type','price','volume']
def get_name(self,obj):
return obj.beer.name
def get_alchol(self,obj):
return obj.beer.alchol
class BarSerializer(serializers.ModelSerializer):
beers = serializers.SerializerMethodField()
class Meta:
model = Bar
fields = ['id', 'name', 'beers']
def get_beers(self,obj:Bar):
beers = obj.barbeer_set.all()
return BarBeerSerializer(beers,many=True).data
如果有错误,请在评论中提出。
推荐阅读
- azure - 正在删除 Azure 服务总线主题/订阅
- python - 无法遍历列表 - Openpyxl
- scala - ScalaTest 无法验证 Future 内部的模拟函数调用
- javascript - A-Frame AR.js 应用程序无法识别我的标记模式,并且在加载页面时也会出现黑色覆盖
- java - 使用 Comparator 根据多个字段的值比较对象
- dygraphs - updateOptions 和 strokeWidth
- php - 从 fread 函数中获取数据时显示双数据的计数器
- python - 如何创建一个填充有最小值和最大值的新 DataFrame?
- git - 在 git 中引用 master branch-tip 和 HEAD 之间的所有提交
- c++ - x 和 y 轴的陀螺仪数据相同,如何解决?