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

私が達成しようとしているのは、対応する各 Person インスタンスの属性を含む Runner インスタンスのリストを含む JSON 応答を取得し、その後エンコードすることです。

リーダーボード メソッドでは、クエリの例を書きました。それを実行すると、次のようになります。

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

私が望むのは、QuerySet で各「person_id」フィールドを Person インスタンスとそのインスタンスに関連付けられたすべての属性 (つまり、first_name、last_name など) で展開 (および置換) することです。

これは可能ですか?prefetch_related() と select_related の両方で遊んでみましたが、役に立ちませんでした。

いつものように、どんな助けも大歓迎です。

4

1 に答える 1

1

次のようにして、レースのすべてのランナーを取得できます。

self.runner_set.select_related('person')

これにはすべてのランナーが含まJOINれ、人物テーブルが含まれます。

を使用する.values()と、外部キーの値が返されますが、これは必要なものではありません。

related_name="runners"必要に応じて、外部キー内で Raceを使用できます。その後、次の方法でアクセスできますself.runners...

于 2013-02-11T03:17:58.023 に答える