【问题标题】:Django Tastypie - Filtering ToManyField resource with URL parameterDjango Tastypie - 使用 URL 参数过滤 ToManyField 资源
【发布时间】:2013-11-30 21:01:04
【问题描述】:

我正在使用 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 参数在 User 资源中按 'datetime' 过滤 Data 资源,例如:

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

获取用户的 numbertimezonedevice idData 列表,使用给定的 日期时间

我不想单独查询 Data 资源来过滤它们,我希望整个东西都捆绑在 User 资源中。 有没有办法使用框架实现应用于嵌套资源的过滤器?

感谢您的宝贵时间,如有任何建议,我将不胜感激!

【问题讨论】:

    标签: python django python-2.7 tastypie


    【解决方案1】:

    您可以使用完整的函数扩展您传递给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 上进一步过滤它。

    Reference.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 2021-10-23
      • 2014-03-21
      • 1970-01-01
      相关资源
      最近更新 更多