python - 如何在没有嵌套在 Django REST 框架中的情况下获取关联模型?
问题描述
如何获得一个json
带有关联模型但没有嵌套在 Django 休息框架中的模型?
代码 :
ModelsSession
和Athlete
, Athlete
models 有外键关系Session
class Session(models.Model):
Id = models.AutoField(primary_key=True)
SessionNo = models.SmallIntegerField()
WinTeam = models.SmallIntegerField(null=True)
class Athlete(models.Model):
Id = models.AutoField(primary_key=True)
Name = models.CharField(max_length=6)
Age = models.SmallIntegerField()
Session = models.ForeignKey(Session, on_delete=models.CASCADE, related_name='athletes')
Status = models.SmallIntegerField()
序列化器
class SessionSerializer(serializers.ModelSerializer):
class Meta:
model = Session
fields = '__all__'
class AthleteSerializer(serializers.ModelSerializer):
Session = SessionSerializer(read_only=True)
class Meta:
model = Athlete
fields = ('Age', 'Status', 'Session')
和观点:
def all_athletes(request):
"""
Get all athletes list
"""
queryset = Athlete.objects.all().select_related()
serializer = AthleteSerializer(instance=queryset, many=True)
return Response(serializer.data)
API结果是:
[
{
"Age": 38,
"Status": 1,
"Session": {
"Id": 13,
"SessionNo": 1,
"WinTeam": null
}
},
{
"Age": 26,
"Status": 1,
"Session": {
"Id": 13,
"SessionNo": 1,
"WinTeam": null
}
},
{
"Age": 35,
"Status": 2,
"Session": {
"Id": 13,
"SessionNo": 1,
"WinTeam": null
}
}
]
它可以获取关联模型,但我希望关联模型显示没有嵌套,如何满足我的期望?
我期望 API 结果:
[
{
"Age": 38,
"Status": 1,
"Id": 13,
"SessionNo": 1,
"WinTeam": null
},
{
"Age": 26,
"Status": 1,
"Id": 13,
"SessionNo": 1,
"WinTeam": null
},
{
"Age": 35,
"Status": 2,
"Id": 13,
"SessionNo": 1,
"WinTeam": null
}
]
解决方案
你可以试试 SerializerMethodFields....
class AthleteSerializer(serializers.ModelSerializer):
Id = serializers.SerialierMethodField(read_only=True)
SessionNo = serializers.SerialierMethodField(read_only=True)
WinTeam = serializers.SerialierMethodField(read_only=True)
class Meta:
model = Athlete
fields = ('Age', 'Status', 'Id', 'SessionNo', 'WinTeam')
def get_Id(self, obj):
return obj.Session.id
def get_SessionNo(self, obj):
return obj.Session.SessionNo
def get_WinTeam(self, obj):
return obj.Session.WinTeam
然后记住在视图的查询集中预取会话关系,否则它将针对这些多个字段多次访问数据库
推荐阅读
- django - Django 上的谷歌 youtube api
- python - 我应该如何将 float32 图像转换为 uint8 图像?
- types - 变体定义中的多态变体限制
- mongodb - 使用 mongoosastic 将数据存储在 ES 中而不是 MongoDB 中
- ruby-on-rails - 除非我刷新页面,否则搜索栏不起作用
- swift - Swift 4 使用 Alamofire 和 Codable 编写发布请求
- kivy - Kivy 语言按钮/标签内的多个文本字段
- angular - 如何让 RxJS 可观察管道访问原始可观察对象的发射和管道的先前发射?
- ruby-on-rails - Rails API 使用 Github OAuth 认证
- python-3.x - 如何在 tkinter 的可滚动画布上添加浮动文本