0

我是编写 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() 

如何设置它以便一个人可以有多个职位?

4

4 回答 4

1

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

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

于 2013-07-26T17:55:51.087 回答
1

你已经在那里解决了!

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

IE。

# 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默认命名,如果您想要一个更友好的名称,您可以将 related_name 添加到字段

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

positions = some_person.positions.all()
于 2013-07-26T18:12:27.117 回答
0

在您的职位类的末尾添加:

person = models.ForeignKey(Person)

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

于 2013-07-26T18:02:38.410 回答
0

正如一些人所说,你说得对。当您使用外键时,您声明它的模型与另一个模型具有一对多的关系。在您的情况下, aPerson具有一对多的关系,Position这意味着 aPerson可以有很多Positions,但 aPosition只能有一个Person

您可以使用RelatedManagerPositions为一个人访问

要访问Positionsfor eachPerson只需执行类似的操作

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...
于 2013-07-26T18:18:22.407 回答