【问题标题】:Django Rest queryset filter by url parameterDjango Rest 查询集按 url 参数过滤
【发布时间】:2014-08-23 09:19:30
【问题描述】:

我需要根据 url 参数过滤 ListAPIView 中的查询集。基本上,应用程序会列出一个事件的所有参与者(用户)并调用 API,例如 /events/:id/attendees/

您可以在下面找到序列化程序、模型、网址和视图。我还想知道在 Django REST 中进行此类端点实现的任何其他做法

**serializers.py**
class AttendeeSerializer(serializers.ModelSerializer):
    user = UserSerializer()

    class Meta:
        model = Attendee
        fields = ('user', 'status')


**views.py**
class EventAttendeeList(generics.ListAPIView):
    queryset = Attendee.objects.all()
    serializer_class = AttendeeSerializer
    #permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

    def get_queryset(self):
        # It should filter attendees by event_id posted in URL
        return Attendee.objects.all()

**urls.py**

url(r'^events/(?P<pk>[0-9]+)/attendees/$', views.EventAttendeeList.as_view()),


**models.py**
class Event(models.Model):
    name = models.CharField(max_length=500, blank=True)
    attendees = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Attendee', related_name='attendees_event')


class Attendee(models.Model):
    event = models.ForeignKey(Event, related_name="a_event")
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="a_user")
    requested_on = models.DateTimeField(default=timezone.now)

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以使用 self.kwargs['parameter_name'] ( http://www.django-rest-framework.org/api-guide/filtering#filtering-against-the-url ) 访问视图中的 url 参数。所以最简单的解决方案是

    def get_queryset(self):
        return Attendee.objects.filter(event=self.kwargs['pk'])
    

    【讨论】:

    • self.request.QUERY_PARAMS.get('pk', None) 是更好的用法:感谢您的链接
    • 抱歉,QUERY_PARAMS 在这种情况下不起作用。我还在寻找任何其他方法,例如更改 URL 结构或序列化程序...
    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2020-09-25
    • 2018-07-28
    • 2017-09-24
    • 2018-09-26
    相关资源
    最近更新 更多