7

嗨,我有一个模型,如:

class Appointment(models.Model):
    hospital = models.ForeignKey(Hospital, on_delete=models.CASCADE)
    patient = models.ForeignKey(Patient, on_delete=models.CASCADE)

我的视图看起来像:

class AppointmentViewSet(viewsets.ModelViewSet):
    queryset = Appointment.objects.all()
    serializer_class = AppointmentSerializer

在我的网址中:

router.register(r'appointments', AppointmentViewSet)

现在我想按一些患者 ID 过滤预约列表。此 id 应由请求者通过 url 提供。我正在考虑使用kwargs来捕捉它。但我不知道该怎么做。我知道我必须重写list方法。

def list(self, request, *args, **kwargs):
    # what do I write here? so that the queryset would be filtered by patient id sent through the url? 

如何自定义url和/或视图以适应患者 ID 参数?我只想修改列表请求,所有其他操作(创建、详细信息、销毁)应由模型视图集的默认行为处理。

谢谢。

4

3 回答 3

4

这是我最终的做法:

我添加了一个这样的 url 条目:

url(r'appointments/ofpatient/(?P<patient>\d+)', AppointmentViewSet.as_view({'get': 'list'})),

我可以从浏览器调用:

http://localhost:8000/appointments/ofpatient/6

并认为:

def list(self, request, patient=None):
    if patient:
        patient = Patient.active.filter(id=patient)
        appts = Appointment.active.order_by('appt_time').filter(patient=patient)
        serializer = self.get_serializer(appts, many=True)
        return Response(serializer.data)
    else:
        appts = Appointment.active.order_by('appt_time')
        serializer = self.get_serializer(appts, many=True)
        return Response(serializer.data)

这样,/appointments url 也被保留了下来。

于 2017-06-14T05:34:19.677 回答
2

您可以定义一个自定义方法来处理带有患者 ID 的 url 的路由:

from rest_framework.decorators import list_route
rom rest_framework.response import Response

class AppointmentViewSet(viewsets.ModelViewSet):
    ...

    @list_route()
    def patient_appointments(self, request, id=None):
        serializer = self.get_serializer(queryset.filter(patient_id=id), many=True)
        return Response(serializer.data)

装饰器将list_route您的方法标记为需要路由。

更新:

您可以手动将 url 注册为:

url(r'^(?P<id>[0-9]+)/appointments/$', AppointmentViewSet.as_view({'get': 'patient_appointments'}), name='patient-appointments')
于 2017-06-14T04:56:24.123 回答
1

尝试

if(self.request.get('pid')):
    pk = self.request.get('pid')
    all_appointment = Appointment.objects.filter(patient__pk=pk)

对于患者的网址将是appoinment/?pid=9

以及预约详情appoinment/9

于 2017-06-14T04:41:03.167 回答