我正在使用Tastypie为Django(v1.5)应用程序实现一个API。我希望能够在父资源时过滤/限制我获得的相关资源。
以下是我的(简化)模型:
# myapp/models.py
class User(models.Model):
number = models.IntegerField()
device_id = models.CharField(verbose_name="Device ID", max_length=255)
timezone = models.CharField(max_length=255, blank=True)
def data(self, limit=0):
result = Data.objects.filter(patient_id = self.id).order_by('-datetime').values('datetime', 'value')
if limit != 0:
result = result[:limit]
return result
class Data(models.Model):
user = models.ForeignKey(User)
datetime = models.DateTimeField()
value = models.IntegerField()
我的资源:
# api/resources.py
class DataResource(ModelResource):
class Meta:
queryset = Data.objects.all()
resource_name = 'cgm'
fields = ['value', 'datetime']
serializer = Serializer(formats=['json', 'xml'])
filtering = {
'datetime': ('gte', 'lte'),
}
include_resource_uri = False
def dehydrate(self, bundle):
bundle.data['timestamp'] = calendar.timegm(bundle.data['datetime'].utctimetuple())
return bundle
class UserResource(ModelResource):
data = fields.ToManyField(DataResource, attribute=lambda bundle: Data.objects.filter(patient_id=bundle.obj.id), full=True, related_name='data', null=True)
class Meta:
queryset = User.objects.all().order_by('number')
resource_name = 'user'
fields = ['number', 'timezone', 'device_id'],
serializer = Serializer(formats=['json', 'xml'])
filtering = {
'data': ALL_WITH_RELATIONS,
}
我希望能够使用URL参数,通过用户资源内的"日期"来过滤数据的资源,例如:
127.0.0.1:8000/api/v1/user/1/?format=json&datetime__gte=2013-11-14%2012:00:00
或
127.0.0.1:8000/api/v1/user/1/?format=json&data__datetime__gte=2013-11-14%2012:00:00
以获取用户的号码、时区,设备id和数据列表,这些列表使用给定的datetime进行过滤。
我不想单独查询数据资源来过滤它们,我希望整个东西都捆绑在用户的资源中。有没有一种方法可以使用框架实现应用于嵌套资源的过滤器?
谢谢你抽出时间,如果有任何建议,我将不胜感激!
您可以使用全尺寸函数扩展传递给data
字段的attribute
参数,并重用DataResource
:
def filter_data_items(bundle):
res = DataResource()
new_bundle = Bundle(request=bundle.request)
objs = res.obj_get_list(new_bundle)
return objs.filter(parent_id=bundle.obj.pk)
res.obj_get_list
处理根据DataResource
定义的构建和应用过滤器。你只需要在parent_id
上进一步过滤它。
参考。