Django rest:使用 ForeignKey 访问所有相关对象
Django rest: accessing all related objects using ForeignKey
我卡住了,我不知道出了什么问题...对我来说它与 DRF API 指南中的“嵌套关系”示例相同,但有些地方不对...
型号
class PlayerSquadra(models.Model):
player = models.ForeignKey(
'app_player.Player',
on_delete=models.CASCADE,
verbose_name=_('giocatore'),
related_name='player_squadraplayer',
)
squadra = models.ForeignKey(
'app_stagione.Squadra',
on_delete=models.CASCADE,
verbose_name=_('squadra'),
related_name='squadra_squadraplayer'
)
def __str__(self):
return '%s' % (self.player)
URL
router.register(r'squadraJSON/(?P<squadra>.*)', views.SquadraViewSet)
VIEW
class SquadraViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Squadra.objects.all()
serializer_class = SquadraSerializer
def get_queryset(self):
laSquadra = self.kwargs['squadra']
queryset = Squadra.objects.filter(id=int(laSquadra))
return queryset
串行器
class PlayerSquadraSerializer(serializers.ModelSerializer):
class Meta:
model = PlayerSquadra
fields = '__all__'
class SquadraSerializer(serializers.ModelSerializer):
playersquadra = PlayerSquadraSerializer(many=True, read_only=True)
class Meta:
model = Squadra
fields = ['nomeSquadra','id','playersquadra']
当我调用 http://192.168.0.102:8000/squadraJSON/26/ 时得到的是:
GET /squadraJSON/26/
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{
"nomeSquadra": "prova2",
"id": 26
}
]
没有错误...虽然我期待这样的事情:
GET /squadraJSON/26/
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{
"nomeSquadra": "prova2",
"id": 26
"playersquadra": [
{'id': 1, 'firstName': 'Michael', 'lastName': 'Jordan',...},
{'id': 2, 'firstName': 'Larry', 'lastName': 'Bird',...},
...
],
}
]
你能给我一些提示,为什么我没有得到所有属于 id=26 的 Squadra 的玩家?感谢您的帮助
您必须使用 related_name
访问所有相关的 PlayerSquadra
,即 squadra_squadraplayer
,因此:
class SquadraSerializer(serializers.ModelSerializer):
playersquadra = PlayerSquadraSerializer(
many=True, read_only=True, source='squadra_squadraplayer',
)
class Meta:
model = Squadra
fields = ['nomeSquadra','id','playersquadra']
或:
class SquadraSerializer(serializers.ModelSerializer):
# This will change the name of the key to squadra_squadraplayer
squadra_squadraplayer = PlayerSquadraSerializer(many=True, read_only=True)
class Meta:
model = Squadra
fields = ['nomeSquadra','id','squadra_squadraplayer']
甚至:
class SquadraSerializer(serializers.ModelSerializer):
playersquadra = serializers.SerializerMethodField()
class Meta:
model = Squadra
fields = ['nomeSquadra','id','playersquadra']
def get_playersquadra(self, obj):
return PlayerSquadraSerializer(
obj.squadra_squadraplayer, many=True, read_only=True,
).data
我卡住了,我不知道出了什么问题...对我来说它与 DRF API 指南中的“嵌套关系”示例相同,但有些地方不对...
型号
class PlayerSquadra(models.Model):
player = models.ForeignKey(
'app_player.Player',
on_delete=models.CASCADE,
verbose_name=_('giocatore'),
related_name='player_squadraplayer',
)
squadra = models.ForeignKey(
'app_stagione.Squadra',
on_delete=models.CASCADE,
verbose_name=_('squadra'),
related_name='squadra_squadraplayer'
)
def __str__(self):
return '%s' % (self.player)
URL
router.register(r'squadraJSON/(?P<squadra>.*)', views.SquadraViewSet)
VIEW
class SquadraViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Squadra.objects.all()
serializer_class = SquadraSerializer
def get_queryset(self):
laSquadra = self.kwargs['squadra']
queryset = Squadra.objects.filter(id=int(laSquadra))
return queryset
串行器
class PlayerSquadraSerializer(serializers.ModelSerializer):
class Meta:
model = PlayerSquadra
fields = '__all__'
class SquadraSerializer(serializers.ModelSerializer):
playersquadra = PlayerSquadraSerializer(many=True, read_only=True)
class Meta:
model = Squadra
fields = ['nomeSquadra','id','playersquadra']
当我调用 http://192.168.0.102:8000/squadraJSON/26/ 时得到的是:
GET /squadraJSON/26/
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{
"nomeSquadra": "prova2",
"id": 26
}
]
没有错误...虽然我期待这样的事情:
GET /squadraJSON/26/
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{
"nomeSquadra": "prova2",
"id": 26
"playersquadra": [
{'id': 1, 'firstName': 'Michael', 'lastName': 'Jordan',...},
{'id': 2, 'firstName': 'Larry', 'lastName': 'Bird',...},
...
],
}
]
你能给我一些提示,为什么我没有得到所有属于 id=26 的 Squadra 的玩家?感谢您的帮助
您必须使用 related_name
访问所有相关的 PlayerSquadra
,即 squadra_squadraplayer
,因此:
class SquadraSerializer(serializers.ModelSerializer):
playersquadra = PlayerSquadraSerializer(
many=True, read_only=True, source='squadra_squadraplayer',
)
class Meta:
model = Squadra
fields = ['nomeSquadra','id','playersquadra']
或:
class SquadraSerializer(serializers.ModelSerializer):
# This will change the name of the key to squadra_squadraplayer
squadra_squadraplayer = PlayerSquadraSerializer(many=True, read_only=True)
class Meta:
model = Squadra
fields = ['nomeSquadra','id','squadra_squadraplayer']
甚至:
class SquadraSerializer(serializers.ModelSerializer):
playersquadra = serializers.SerializerMethodField()
class Meta:
model = Squadra
fields = ['nomeSquadra','id','playersquadra']
def get_playersquadra(self, obj):
return PlayerSquadraSerializer(
obj.squadra_squadraplayer, many=True, read_only=True,
).data