![](/img/trans.png)
[英]How to get JSON data in django rest framework without tying it to a model
[英]How to get relate model without nested in Django rest framework?
如何獲得json
與 relate model 但沒有嵌套在 Django rest 框架中?
代碼:
Models, Session
and Athlete
, Athlete
模型與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
}
}
]
它可以獲取 relate model,但我想要 relate models show without nested ,如何滿足我的期望?
我期待 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
然后記得在視圖的查詢集中預取 Session 關系,否則它會針對這些多個字段多次訪問數據庫
您也可以覆蓋 AthleteSerializer 中的AthleteSerializer
to_representation()
。 這樣你就不需要SerialierMethodField
。
def to_representation(self, value):
ref = super().to_representation(value)
session = ref.pop("Session")
ref.update(**session)
return ref
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.