2016-02-25 49 views
1

有人可以帮助我,我需要一个只有唯一用户的股票列表,只有最新的股票公关。用户(post__user)Tastypie apply_filters与截然不同

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

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资源::我的代码示例,但给我所有的股份,而不仅仅是一个(最新的)公关。用户..希望有人能帮助。

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

嗯,看起来更像是一个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的工作。

+0

Humm,thanks;)..我在我的开发环境中使用sqlite3,是否有一种解决方法可以在没有区分的情况下工作([* fields]) – pkdkk

+0

不确定。如果您没有选择相关数据,则无论如何它都可以工作,只需一次。我认为DISTINCT通常在SELECTED的任何字段上运行。 –