Django,如何通过模型字段访问模型内​​的模型

时间:2017-12-08 18:50:03

标签: python django django-models

我有两个模型,它们之间有多对一的关系。

from django.db import models


class Continent(models.Model):
    name = models.CharField(max_length=255, unique=True)
    code = models.CharField(max_length=2, unique=True, primary_key=False)
    c = Continent.objects.get(id=1)
    countries = c.country_set.all()
    class Meta:
        ordering = ["name"]


class Country(models.Model):
    name = models.CharField(max_length=255, unique=True)
    capital = models.CharField(max_length=255)
    code = models.CharField(max_length=2, unique=True, primary_key=False)
    continent = models.ForeignKey('Continent')
    population = models.PositiveIntegerField()
    area = PositiveIntegerField()
    class Meta:
        ordering = ["name"]

我希望通过Continent模型中的国家/地区属性访问非洲大陆的国家/地区。我试图按照文档(下面的链接)中的“向后”关系,但无法使其工作。 https://docs.djangoproject.com/en/1.11/topics/db/queries/#backwards-related-objects

1 个答案:

答案 0 :(得分:1)

您需要在related_name关系中设置ForeignKey参数。这会自动将具有该名称的字段添加到Continent模型。

这就是模型的外观(注意Country.continent外键字段中的'related_name'参数):

class Continent(models.Model):
    name = models.CharField(max_length=255, unique=True)
    code = models.CharField(max_length=2, unique=True, primary_key=False)

    class Meta:
        ordering = ["name"]


class Country(models.Model):
    name = models.CharField(max_length=255, unique=True)
    capital = models.CharField(max_length=255)
    code = models.CharField(max_length=2, unique=True, primary_key=False)
    continent = models.ForeignKey('Continent', related_name='countries')
    population = models.PositiveIntegerField()
    area = PositiveIntegerField()
    class Meta:
        ordering = ["name"]

现在你可以这样做:

def test():
    c = Continent.objects.get(id=1)
    for country in c.countries.all():
        print(c.name)

country_set是用作相关名称的默认名称。您无需将其设置为Continent类中的显式字段。它是在幕后创建的。