需要从表3中检索关系表1的记录 - (OneToMany) - >表2 - (OneToOne) - >表3

时间:2014-01-02 13:07:47

标签: django django-models django-queryset

我正在使用django 1.4并陷入这样一种情况:我必须从数据库中检索记录而不使用 For loop

情况如下:

人物模型(表1)

class Person(models.Model):
    first_name = models.CharField(max_length=100, blank=True, default='')
    middle_name = models.CharField(max_length=100, blank=True, default='')
    last_name = models.CharField(max_length=100, blank=True, default='')
    full_name = models.CharField(max_length=255, blank=True, default='')
    degree = models.CharField(max_length=100, blank=True, default='')
    email = models.EmailField(blank=False, unique=True)

PersonNominationProfile模型(表2)

class PersonNominationProfile(models.Model):
    person = models.ForeignKey('Person', null=False, blank=False,   related_name='nomination_profile')
    person_type = models.ForeignKey('PersonType', default=None, null=True)
    status = models.ForeignKey(SpeakerStatus, related_name='status_nomination_profiles', blank=True, null=True, default=None)
    tier = models.ForeignKey('PersonTier', related_name='tier_nomination_profiles', default=None, null=True, blank=True)
    series = models.ForeignKey(Series, null=False, blank=False)
    year = models.IntegerField(null=True)

PersonCertification模型(表3)

class PersonCertification(models.Model):
    nomination_profile = models.OneToOneField('PersonNominationProfile',null=False, blank=False)
    background_check_sent_date = models.DateField(auto_now_add=False,null=True)
    debarment_check_completed_date = models.DateField(auto_now_add=False,null=True)
    license_check_completed_date = models.DateField(auto_now_add=False,null=True)

所以我正在从Person表中检索记录及其相关数据来自PersonNominaionProfile但无法从PersonCertification获取数据。

我希望在不使用for循环的情况下从PersonCertification获取记录。

我试过这个

all_speakers = Person.objects.filter(nomination_profile__person_type__name='Speaker')\
   .values('id','nomination_profile__series_id', 'nomination_profile__series__name',
           'last_name', 'first_name', 'middle_name', 'degree', 'email'))

这会提供与PersonNominationProfile相关的所有内容但是我如何从PersonCertification获取记录。

请告诉我一个优化的解决方案。

1 个答案:

答案 0 :(得分:0)

由于您在OneToOneField上定义了PersonCertification,因此您应该可以通过personcertification上的PersonNominationProfile字段访问反向关系。如果您使用现有查询但添加,例如:

'nomination_profile__personcertification__background_check_sent_date'

values()的参数,你应该得到你想要的东西。