Django-Tastypie高级过滤

时间:2013-06-15 11:55:59

标签: django rest tastypie

我正在使用Django-Tastypie。

我有一个像

这样的网址
/api/v1/pic/?event=25&format=json

这将返回?event=25的所有照片。但我还有其他一些应该考虑的事情。

就像一个私有的事件(即:event.private=1),它应该对它返回的照片进行某种过滤。我该如何实现它?任何指针都会有很大的帮助。

3 个答案:

答案 0 :(得分:2)

你能更具体一点吗? 你想要什么样的过滤器。

对于私有事件过滤器,您可以在模型中定义一个布尔字段:

=====================模型=====================

class Event(models.Model):
    private = models.BooleanField()
    ...

class Pic(models.Model):
    event = models.ForeignKey(Event)
    date = models.DateTimeField()
    ...

=====================资源=====================

class PicResource(ModelResource):
    event = fields.ForeignKey(EventResource, 'event')
    class Meta:
        queryset = Pic.objects.all()
        filtering = {
            'event' : ALL_WITH_RELATIONS,
            'date' : ALL
        }
        ordering = ['date', 'event']

然后,您可以查询资源:

  1. 私人活动的所有照片 - / api / v1 / pic /?event__private = True& format = json
  2. 按日期排序的所有照片最新 - / api / v1 / pic /?format = json& order_by = -date(注意“ - ”符号表示降序。

答案 1 :(得分:0)

我登陆这里是为了寻找更通用的Tastypie过滤,所以我想在@ ge7600的答案中添加更多内容。

如果要过滤字段,则可以在URL中使用任何有效的Django查询语法。如果我公开了这些字段进行过滤:

class PicResource(ModelResource):
    event = fields.ForeignKey(EventResource, 'event')
    class Meta:
        queryset = Pic.objects.all()
        filtering = {
            'event' : ALL_WITH_RELATIONS,
            'date' : ALL,
            'title' : ALL
        }
        ordering = ['date', 'event']

我可以使用以下网址参数进行过滤:

/api/v1/pic/?event=25
/api/v1/pic/?title__contains=sunset
/api/v1/pic/?date__gte=2015-06-01&title__contains=wedding

如果我更仔细地阅读文档,我可能会早点想到的...

答案 2 :(得分:-1)

您只需要定义resource

from django.contrib.auth.models import User
from tastypie import fields
from tastypie.authorization import DjangoAuthorization
from tastypie.resources import ModelResource, ALL, ALL_WITH_RELATIONS
from myapp.models import Entry


class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.all()
        resource_name = 'auth/user'
        excludes = ['email', 'password', 'is_superuser']


class EntryResource(ModelResource):
    user = fields.ForeignKey(UserResource, 'user')

    class Meta:
        queryset = Entry.objects.all()
        list_allowed_methods = ['get', 'post']
        detail_allowed_methods = ['get', 'post', 'put', 'delete']
        resource_name = 'myapp/entry'
        authorization = DjangoAuthorization()
        filtering = {
            'slug': ALL,
            'user': ALL_WITH_RELATIONS,
            'created': ['exact', 'range', 'gt', 'gte', 'lt', 'lte'],
        }