我希望你身体健康。这是我与DRF的第一个个人项目,我遇到了以下问题。我有两种型号:
class Area(models.Model):
name = models.CharField(max_length=100)
...
和
class SubArea(models.Model):
area = models.ForeignKey("Area", on_delete=models.CASCADE, verbose_name='Area relacionada',
related_name='subareas')
name = models.CharField(max_length=100)
...
我能够使用HyperlinkedRelatedField 做一些类似于我需要的事情
class SubareaSerializer(serializers.ModelSerializer):
contents = ContentSerializer(many=True, read_only=True)
quizzes = QuizSerializerAux(many=True, read_only=True)
class Meta:
model = SubArea
fields = ['id', 'name', 'description', 'quizzes', 'contents']
class AreaSerializer(serializers.HyperlinkedModelSerializer):
subareas = serializers.HyperlinkedRelatedField(
many=True,
read_only=True,
view_name='subarea-detail',
)
class Meta:
model = Area
fields = ['url','id', 'name', 'description', 'subareas',]
但这就是我使用端点api/area/:得到的
{
"url": "http://127.0.0.1:8000/rest-auth/quiz/area/1/",
"id": 1,
"name": "Area 1 de teste",
"description": "Area 1 de teste - descrição",
"subareas": [
"http://127.0.0.1:8000/rest-auth/quiz/subarea/1/",
"http://127.0.0.1:8000/rest-auth/quiz/subarea/2/"
]
},
我得到了一个列表,其中有几个到分区的链接,但我只需要一个链接,列出所有与该区域相关的分区,例如:
/api/区域/1/分区
将列出区域id=1 中所有子区域的端点
{
"url": "http://127.0.0.1:8000/rest-auth/quiz/area/1/",
"id": 1,
"name": "Area 1 de teste",
"description": "Area 1 de teste - descrição",
"subareas": [
"http://127.0.0.1:8000/rest-auth/quiz/area/1/subarea"
]
},
如何使用DRF完成此操作?
这些是我的观点
class AreaViewSet(viewsets.ModelViewSet):
queryset = Area.objects.all()
serializer_class = AreaSerializer
class SubareaViewSet(viewsets.ModelViewSet):
queryset = SubArea.objects.all()
serializer_class = SubareaSerializer
这些是我的网址.py
router_quiz = routers.DefaultRouter()
router_quiz.register(r'area', AreaViewSet)
router_quiz.register(r'subarea', SubareaViewSet)
...
path('rest-auth/quiz/', include(router_quiz.urls)),
要获得指向子级列表的单个链接,而不是指向子级本身的链接列表,应将HyperlinkedRelatedField
的使用替换为HyperlinkedIdentityField
。
根据官方文件:
HyperlinkedRelatedField
这个序列化程序将为您提供这样的表示:
{
'album_name': 'Graceland',
'artist': 'Paul Simon',
'tracks': [
'http://www.example.com/api/tracks/45/',
'http://www.example.com/api/tracks/46/',
'http://www.example.com/api/tracks/47/',
...
]
}
HyperlinkedIdentityField
这个序列化程序将为您提供这样的表示:
{
'album_name': 'The Eraser',
'artist': 'Thom Yorke',
'track_listing': 'http://www.example.com/api/track_list/12/',
}