Tastypie apply_filters具有独特性

时间:2016-02-25 19:03:49

标签: python django django-models tastypie

有人可以帮助我,我需要一个只有唯一用户的共享列表,只有最新的份额pr。用户(post__user)

我在API框架中使用tastypie,希望有人可以帮助我,我的模型布局看起来像这样::

class Post(models.Model):
    user = models.ForeignKey(User)
    ....

class Share(models.Model):
    post = models.ForeignKey(Post)
    user = models.ForeignKey(User, blank=True, null=True)
    ....

我的Tastypie资源::我的代码示例,但给了我所有的份额,而不仅仅是一个(最新的)pr。用户..希望有人可以提供帮助。

class ShareResource(ModelResource):
    ....
    ....
    def apply_filters(self, request, applicable_filters):
        distinct = request.GET.get('distinct', False) == 'True'
        if distinct:
            d = self.get_object_list(request).filter(**applicable_filters).values_list("post__user", flat=True).distinct()
            return Share.objects.filter(post__user__id__in=d)
        else:
            return self.get_object_list(request).filter(**applicable_filters)

1 个答案:

答案 0 :(得分:1)

嗯,好像更像是一个ORM问题。

d将是一个由applicable_filters过滤的完全共享内容的唯一身份用户列表。然后,您将查询已共享内容的用户列表中的某人共享的共享对象;但是此查询将返回这些用户已共享但不在applicable_filters中的共享对象。此外,它将返回重复项。

我想你想要这个:

class ShareResource(ModelResource):
    ....
    ....
    def apply_filters(self, request, applicable_filters):
        distinct = request.GET.get('distinct', False) == 'True'
        if distinct:
            # need to order Share objects so that the most recent one comes first
            return self.get_object_list(request).filter(**applicable_filters).order_by('id', '-created').distinct('id')
        else:
            return self.get_object_list(request).filter(**applicable_filters)

请注意,这可能仅适用于Postgres。