django rest框架 - 查询嵌套List?

时间:2015-12-15 16:31:13

标签: python django django-rest-framework

使用DRF,并对是否可以查询嵌套项(如列表)感到好奇。例如,能够过滤查询参数,例如:http://someurl.com?hashtags=cool

{
    "id": 1,
    "author": 1,
    "hashtags": [
        "cool", "gross"
    ],
    "username": "johndoe"

}

我已经检查了Django Filters,并且正在寻找特定于DRF的东西,有点像: hashtags = django_filters.filters.CharFilter(name="hashtags")但是要迭代嵌套的List。显然CharFilter不正确。

感谢您的任何提示或想法。

-Updated-

过滤器显然不起作用,但我试图去的地方

views.py

class MentionLatFilter(django_filters.FilterSet):
    hashtags = django_filters.filters.SomeFilter(name="hashtags")

    class Meta:
        model = Mention
        fields = ['hashtags']


class MentionList(generics.ListAPIView):
    serializer_class = MentionSerializer  
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = MentionLatFilter       


    def get_queryset(self):
        queryset = Mention.objects.all()
        placename = self.request.query_params.get('placename', None)
        if placename is not None:
            queryset = queryset.filter(placename=placename)

        username = self.request.query_params.get('username', None)
        if username is not None:
            queryset = queryset.filter(username=username)  

        return queryset

models.py

class Mention(models.Model):
    author = models.ForeignKey(User)
    username =  models.CharField(max_length=140, default='Username')
    placename = models.CharField(max_length=140, default='SOME STRING')
    placemention = models.TextField(max_length=140, default='SOME STRING')
    lat = models.DecimalField(max_digits=20, decimal_places=15)
    lng = models.DecimalField(max_digits=20, decimal_places=15)
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.placename



class Hashtag(models.Model):
    mention = models.ForeignKey(Mention, related_name='hashtags')
    tagname = models.CharField(max_length=100)

    class Meta:
        unique_together = ('mention', 'tagname')

    def __unicode__(self):
        return '%s' % (self.tagname)

1 个答案:

答案 0 :(得分:1)

此处您不需要自定义过滤器。 Django查询集可以很好地遵循反向关系,进行过滤。请检查此链接:https://docs.djangoproject.com/en/1.8/topics/db/queries/#lookups-that-span-relationships

以下是修改get_queryset()方法的方法:

class MentionList(generics.ListAPIView):
    def get_queryset(self):
        hashtag_filter = self.request.query_params.get('hashtags', None)
        return Mention.objects.filter(hashtag__tagname=hashtag_filter)