2016-02-25 54 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的任何字段上運行。 –