2013-02-11 96 views
0

我有以下表格:追溯外國鍵

class Person (models.Model): 

    GENDER_CHOICES = (
         ('M', 'Male'), 
         ('F', 'Female'), 
        ) 

    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    gender = models.CharField(max_length = 1, choices=GENDER_CHOICES, default='M') 
    age = models.IntegerField() 
    photo = models.ImageField(upload_to='uploads/images/runners', blank=True) 

    def __unicode__(self): 
     return '%s, %s' % (self.last_name, self.first_name) 

class Runner (models.Model): 
    ''' Represents a runner actually in a particular Race ''' 
    position = models.IntegerField() 
    person = models.ForeignKey(Person, related_name="person") 
    race = models.ForeignKey(Race) 

class Race (models.Model): 
    '''An instance of an Event. i.e., the race that is happening this year''' 
    year = models.IntegerField() 
    description = models.TextField() 
    event = models.ForeignKey(Event) 

    def leaderboard(self): 
     ''' 
     Orders the leaders and returns the entire set 
     Args: 
     Returns: 
      A list of Runners ordered by position 
     ''' 
     #board = Runner.objects.prefetch_related("person").filter(race=self).order_by('position') 
     board = Runner.objects.prefetch_related("person") 
     print "DEBUG: %s" % board.values() 
     return board 

我試圖做到的是檢索和隨後編碼包含Runner實例列表的JSON響應,其中包含每個相應Person實例的屬性。

在排行榜方法中,我寫了一個我的查詢的例子。在執行了它,我得到如下:

DEBUG: [{'person_id': 1, 'position': 1, 'id': 1, 'race_id': 1}, {'person_id': 2, 'position': 2, 'id': 2, 'race_id': 1}] 

我想那是什麼樣子是有QuerySet的擴大(和替換)每個「PERSON_ID」字段與一個人的實例和實例的所有相關屬性(即名字,姓氏等

這可能嗎?我已經試過兩prefetch_related()和select_related但無濟於事玩耍。

與往常一樣,任何的幫助深表感謝。

+0

訪問它我不確定你使用related_name做你想要的:Person.person.all() - >實例。你可能想'related_name =「運行」'。 – 2013-02-11 03:14:25

回答

1

你可以得到所有的runne在比賽RS做:

self.runner_set.select_related('person') 

這將包含所有的跑步者,也就有了JOIN的人表。

當您使用.values()時,它會返回外鍵值,這不是您想要的值。

如果你願意,你可以在Race的外鍵內使用related_name="runners"。然後你就可以通過self.runners...