我是编写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可以有多个位置?
答案 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)
正如有些人所说的那样你是对的。使用外键时,声明它的模型与另一个模型具有一对多关系。在您的情况下,Person
与Position
具有一对多的关系,这意味着Person
可以包含多个Positions
但Position
只能拥有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...