在Django中,如何设置具有包含另一个模型的多个实例的字段的模型?

时间:2013-07-26 17:53:09

标签: python django

我是编写Django模型的新手。我想拥有一个Person模型,每个人都有不同数量的职位。

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    positions = models.ForeignKey('Position')

class Position(models.Model):
    person = models.ForeignKey(Person)
    company = models.CharField(max_length=200)
    summary = models.TextField()
    start_date = models.DateField()
    end_date = models.DateField()
    currently_there = models.BooleanField() 

如何设置它以便Person可以有多个位置?

4 个答案:

答案 0 :(得分:1)

你拥有的是正确的(你有一个人有很多职位)。

我最初认为是ManyToManyField,但如果这个职位对某人来说是独一无二的,我认为这确实是one to many关系。

答案 1 :(得分:1)

你已经在那里解决了它!

反向许多关系正在返回一个QuerySet,因此使用它查询数据库的方法与获取相关行的方法相同。

# Grab a person
some_person = Person.objects.get(pk=2)

# Get the persons positions
positions = some_person.position_set.filter(currenty_there=True)

# Add a new position for this person
some_person.position_set.add(some_new_position)

默认情况下,反向集名为modelname_set,如果您想要更友好的名称,可以将相关名称添加到字段

class Position(models.Model):
    person = models.ForeignKey(Person, related_name="positions")
    ...

positions = some_person.positions.all()

答案 2 :(得分:0)

在您的Position类末尾添加:

person = models.ForeignKey(Person)

基本上这是一对多的关系(一个人可能有很多职位)。您将不得不重建数据库(使用南迁移,因为syncdb无法从头开始重新创建)以创建外键约束。

答案 3 :(得分:0)

正如有些人所说的那样你是对的。使用外键时,声明它的模型与另一个模型具有一对多关系。在您的情况下,PersonPosition具有一对多的关系,这意味着Person可以包含多个PositionsPosition只能拥有Person一个Positions

您可以使用RelatedManager访问Positions某个人

要访问每个Person的{​​{1}},只需执行类似

的操作
harry = Person.objects.get(first_name="Harry", last_name="Potter")
harry.position_set.all()

Position

创建Person
harry.position_set.create(company="Hogwarts", summary="Student", ... )

etc...