2011-10-28 94 views
1

比方說,我有一組的Django模型:如何從特定的Django模型實例獲取所有RelatedManagers?

class Article(models.Model): 
    title = models.CharField(max_length=100, default='') 
    content = models.TextField(default='', blank=False) 
    created_at = models.DateTimeField(auto_now=True) 
    creator = models.ForeignKey(User, null=True, blank=True) 
    score = models.ForeignKey('Score', blank=True, null=True) 
    points = models.ManyToManyField('Points') 


class Score(models.Model): 
    value = models.IntegerField() 
    created_at = models.DateTimeField(auto_now_add=True) 
    creator = models.ForeignKey(User, null=True, blank=True) 


class Points(models.Model): 
    value = models.DecimalField(max_digits=3, decimal_places=1) 
    caption = models.CharField(max_length=20, default='') 
    created_at = models.DateTimeField(auto_now_add=True) 
    creator = models.ForeignKey(User, blank=True, null=True) 

現在我莫名其妙地得到了Score模型的實例(實際上不知道這是Score模型)再次Points模型(的一個實例,不知道這是Points模型):

>>> type(s) 
<class 'myapp.models.Score'> 
>>> type(p) 
<class 'myapp.models.Points'> 

現在我可以通過下面的代碼獲得一組相關Article實例:

>>> s.article_set 
<django.db.models.fields.related.RelatedManager object at 0x10d1e8610> 
>>> p.article_set 
<django.db.models.fields.related.ManyRelatedManager object at 0x10d1e8850> 

但是在這種情況下,我知道實際的數據庫模式,並且我知道屬性被稱爲article_set。在我的情況下,我不知道實際的數據庫scema。我想獲取當前模型實例的所有RelatedManager屬性。

我認爲有可能通過._meta屬性來實現這一點,但我在嘗試時沒有做到這一點。所以我可能需要一個類似get_related_managers(self)方法實現的實際工作示例。

回答

4

這似乎爲我工作:

def get_related_managers(self): 
    managers = [] 
    for related_object in self._meta.get_all_related_objects(): 
     managers.append(getattr(self, related_object.get_accessor_name())) 
    return managers 

,如果你想許多人manys以及您還將通過self._meta.get_all_related_many_to_many_objects()必須循環。

+0

非常感謝,我發現'_meta'屬性時不知何故錯過了這個。 – ikostia

+0

沒問題。希望有一個更好的方法來做到這一點,因爲非公開屬性(帶有下劃線的屬性,例如'_meta')「不打算被第三方使用; [它不是]保證[d]不是 - 公共屬性不會更改,甚至不會被刪除。「 (來自http://www.python.org/dev/peps/pep-0008/)。但我看不到一個更好的方法來做到這一點。 – Will

+0

實際上,有很多事情你不能用標準Django模型API來做,而且只能通過_meta屬性來完成。有時候,Django真的很糟糕:) – ikostia

相關問題