2014-09-20 23 views
1

我有以下代碼:Python中得到GenericRelation對象

數據/ telephone.py

class TelephoneNumber(models.Model): 

    MOBILE = 0 
    HOME = 1 
    TELEFON_CHOICES = (
     (MOBILE, _("Mobile")), 
     (HOME, _("Landline")), 
    ) 

    object_id = models.PositiveIntegerField() 
    content_type = models.ForeignKey(ContentType) 
    of   = generic.GenericForeignKey('content_type', 'object_id') 

    label = models.SmallIntegerField(choices=TELEFON_CHOICES) 
    number = models.CharField(max_length=20, blank=True) 

model.py

class Staff(models.Model): 

    user = models.OneToOneField(User) 
    telephonenumbers = GenericRelation(TelephoneNumber, related_query_name='telnumber') 

不,我想提供一個函數來檢索這樣的用戶的每個電話號碼:

def get_telnumbers(self): 
    tellist = [] 
    #print(self.telephonenumbers.all()) 
    for tel in self.telephonenumbers.all(): 
     tellist.append(tel) 
    return tellist 

問題是,行print(self.telephonenumbers.all())不打印任何telephonenumbers,即使提供了很多。 返回的字典也是空的。

如何訪問保存在Staff上下文中的GenericRelation對象?

編輯:

下面的代碼:

for tel in TelephoneNumber.objects.all(): 
     print(tel) 
     print(tel.of) 

給我保存的每一個電話號碼,並通過tel.of該電話號碼屬於合適的員工用戶。

那麼爲什麼不是self.telephonenumbers.all()工作(self.user也返回電話號碼應該保存的正確用戶)?

+0

是你的問題解決了嗎? – 2014-09-22 16:50:34

+0

@msngupta請參閱我的編輯,謝謝 – 2014-09-23 17:10:58

回答

0

我仍然不知道爲什麼self.telephonenumbers.all()不工作。

但現在我用這(種醜陋的)解決方法:

def get_telnumbers(self): 
    for tel in TelephoneNumber.objects.all(): 
     if tel.of.id == self.id: 
      ... 

如果有人仍然有一個更好的主意,我是持開放的態度!

0

確保創建一個新的TelephoneNumber對象時您提供content_object屬性是相應Staff對象

+0

你可以舉一個簡單的例子,說明如何做到這一點?謝謝 – 2014-09-20 21:07:59

+0

看看這個例子在djangodocs https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericRelation希望這會有所幫助。 – 2014-09-21 05:16:00