使用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)
答案 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)