Django REST:序列化关联Summary的对象列表链接(Django2.0+Python3.6)
解决方法:生成Summary实例下Object列表的链接
嘿,Django 2.0搭配Python 3.6完全没问题,这个环境对实现你要的功能没有任何影响,放心往下走就好!结合你给出的模型和URL配置,我分步骤给你说怎么实现:
1. 完善URL配置
你之前的URL配置没写完,我们需要添加一个带summary_pk参数的URL,用来指定具体是哪个Summary下的Object列表:
from django.urls import path from . import views object_list = views.ObjectListViewSet.as_view({'get': 'list'}) urlpatterns = [ # 其他已有的URL... path('summary/<int:summary_pk>/objects/', object_list, name='summary-object-list'), ]
这里用Django 2.0开始推荐的path代替旧的url,summary_pk会作为参数传递给视图,方便后续过滤数据。
2. 在视图中过滤指定Summary的Object
接下来修改你的ObjectListViewSet,重写get_queryset方法,根据URL传入的summary_pk过滤出对应的Object:
from rest_framework import viewsets from .models import Object from .serializers import ObjectSerializer # 替换成你自己的序列化器 class ObjectListViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = ObjectSerializer def get_queryset(self): # 从URL参数中获取Summary的主键 summary_pk = self.kwargs.get('summary_pk') # 返回该Summary下的所有Object return Object.objects.filter(summary__pk=summary_pk)
3. 给Summary模型添加生成链接的方法
为了方便在模板或序列化器中调用,我们可以在Summary模型里加一个方法,直接生成对应的Object列表链接:
from django.db import models from django.urls import reverse class Summary(models.Model): type = models.CharField(max_length=100) # 补全你的字段参数 def get_objects_url(self): # 使用reverse根据URL名称生成链接 return reverse('summary-object-list', kwargs={'summary_pk': self.pk}) class Object(models.Model): summary = models.ForeignKey(Summary, on_delete=models.CASCADE) # 你的其他字段...
4. 在模板或API中使用链接
模板中使用
如果是在Django模板里展示Summary信息,直接调用这个方法就行:
<!-- 假设模板上下文里有summary实例 --> <p>查看<a href="{{ summary.get_objects_url }}">该汇总下的所有对象</a></p>
API序列化器中使用
如果是在REST API里返回这个链接,可以在Summary的序列化器中添加一个字段:
from rest_framework import serializers from .models import Summary from django.urls import reverse class SummarySerializer(serializers.ModelSerializer): objects_url = serializers.SerializerMethodField() class Meta: model = Summary fields = ['id', 'type', 'objects_url'] def get_objects_url(self, obj): # 生成绝对URL(需要传入request上下文) request = self.context.get('request') return request.build_absolute_uri(reverse('summary-object-list', kwargs={'summary_pk': obj.pk}))
这样不管是前端页面还是API接口,都能轻松获取到指向对应Object列表的链接啦!
内容的提问来源于stack exchange,提问作者johndough
相关产品推荐
相关产品推荐

