Djangonic在Django中获取二阶DB-info的方法?

时间:2013-05-14 17:56:27

标签: python django django-views

我正在搞乱我的第一个Django网站,到目前为止它还不错。我现在面临着从数据库中获取一些信息的挑战。我的模型看起来像这样:

class Countries(models.Model):
    country = models.CharField(max_length=100)
    def __unicode__(self):
        return self.country

class OrganisationTypes(models.Model):
    organisation_type = models.CharField(max_length=100)
    def __unicode__(self):
        return self.organisation_type

class Organisations(models.Model):
    organisation_name = models.CharField(max_length=200)
    organisation_type = models.ForeignKey(OrganisationTypes)
    country_of_origin = models.ForeignKey(Countries)
    def __unicode__(self):
        return self.organisation_name

class Locations(models.Model):
    organisation = models.ForeignKey(Organisations)
    country_of_location = models.ForeignKey(Countries)
    tel_nr = models.CharField(max_length=15)
    address = models.CharField(max_length=100)
    def __unicode__(self):
        return '%s - %s - %s - %s' % (self.organisation, self.country_of_location, self.tel_nr, self.address)

我现在想要显示我想要显示organisation_name和country_of_origin的位置列表。为此,我编写了以下函数:

def organisation_locations(requests, organisation_id):
    org = Organisations.objects.get(id=organisation_id)
    location_list = Locations.objects.filter(organisation=organisation_id).order_by('country_of_location')
    output = '<br />'.join([str(loc.organisation)+' from '+str(org.country_of_origin) for loc in location_list])
    return HttpResponse(output)

这是正常的,但它似乎不是正确的方法。由于Location表在Organizations表中有一个外键,而且在Countries表中有一个外键,我有一种模糊的感觉,Django可以在一个“查询”或查找中执行此操作。

我觉得这种感觉是正确的,还是我确实是这样做的正确方法?欢迎所有提示!

1 个答案:

答案 0 :(得分:1)

你不能这样做:

location_list = Locations.objects\
                 .filter(organisation=organisation_id)\
                 .order_by('country_of_location')
output = '<br />'.join([str(loc.organisation)+' from '+str(loc.organisation.country_of_origin) for loc in location_list])

组织查询不是必需的。您可以访问以下组织:localization.organisation

代码中没有 Djangonic 的是响应。您应该有一个模板并执行return render_to_response:)