2009-10-27 67 views
2

這裏一定有問題super(InviteManager, self).get_query_set()但我不知道該用什麼。當我查看用戶實例的RelatedManager時,即使用戶沒有任何邀請,也可以使用Django自定義管理器與相關管理器

len(Invite.objects.by_email()) == len(user.invite_set.by_email()) 

即使用戶沒有任何邀請。但是,user.invite_set.all()會正確返回鍵入User對象的所有Invite對象。

class InviteManager(models.Manager): 
    """with this we can get the honed querysets like user.invite_set.rejected""" 

    use_for_related_fields = True 

    def by_email(self): 
     return super(InviteManager, self).get_query_set().exclude(email='') 

class Invite(models.Model): 
    """an invitation from a user to an email address""" 

    user = models.ForeignKey('auth.User', related_name='invite_set') 
    email = models.TextField(blank=True) 
    objects = InviteManager() 

''' 
u.invite_set.by_email() returns everything that Invite.objects.by_email() does 
u.invite_set.all() properly filters Invites and returns only those where user=u 
''' 
+0

我在這裏有同樣的問題,你有任何進展? – shanyu 2009-10-31 20:32:25

+0

我其實沒有嘗試過下面的解決方案。我在口袋裏做了一件醜陋的工作,最後期限迫使我只用它。我應該抓住球並找出它! – 2009-11-01 06:42:37

+0

對我來說同樣的問題。此外,它看起來像打印通過執行相關管理器查詢產生的查詢時,WHERE子句在原始對象的ID上缺少一個篩選器 – Bobby 2015-08-25 15:54:04

回答

2

嘗試:

def by_email(self): 
    return super(InviteManager, self).exclude(email='') 

如果不出意外,.get_query_set()是多餘的。在這種情況下,它可能會返回一個全新的查詢集,而不是完善當前的查詢集。

3

您可能需要一個實現by_email過濾器的自定義QuerySet。請參閱Subclassing Django QuerySets上的示例。

class InviteQuerySet(models.query.QuerySet): 
    def by_email(self): 
     return self.exclude(email='') 

class InviteManager(models.Manager): 
    def get_query_set(self): 
     model = models.get_model('invite', 'Invite') 
     return InviteQuerySet(model) 
0

嘗試使用.all()代替.get_query_set()。這似乎是對我遇到的類似問題的伎倆。

def by_email(self): 
    return super(InviteManager, self).all().exclude(email='') 
1

的文檔指定您should not filter the queryset使用get_query_set()當您更換默認管理相關套。

不要過濾掉這種類型的管理者子類的

一個原因自動管理器使用的訪問是從其他一些模型與對象相關的任何結果。在這些情況下,Django必須能夠查看它所提取模型的所有對象,以便引用的任何對象都可以被檢索。

如果您重寫get_query_set()方法並過濾出所有行,Django將返回不正確的結果。不要這樣做。過濾get_query_set()結果的管理器不適合用作自動管理器。

+0

對我來說,這聽起來像是說「不要在* get_query_set中過濾queryset * )'方法',即當你**重寫**'get_query_set()',這不是他們正在做的事情。 – 2015-04-30 02:26:01