Django Rest Framework-按关系超链接筛选


我希望你身体健康。这是我与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/',
}

最新更新