2013-07-26 47 views
-1

我是新编写Django模型。我想要一个Person模型,每个人都有不同数量的职位。在Django中,如何设置具有包含多个其他模型实例的字段的模型?

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() 

我该如何设置它,让一个人可以有多个职位?

回答

1

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

我最初认为ManyToManyField但我看到这确实是一个one to many关系,如果位置是一个人的唯一。

+0

创建Position那么我是否将外键取出来指那个位置S'而且,如果我在看一个特定的人,我可以看到他们的所有职位吗? –

+0

是的,人不应该有一个FK来定位。职位应该有一个人。使用管理员“内联”来查看它们。使用person.position_set.all()通过ORM访问反向FK。阅读文档/玩得开心。 –

+0

非常感谢。欣赏它 –

0

要得到自己的位置类中添加的末尾:

person = models.ForeignKey(Person) 

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

+0

他已经有了一个'Person'的外键 – Ngenator

1

你已经解决了它!

Reverse许多关系正在返回一个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,如果你想要一个更友好的名称,您可以添加related_name到现场

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

positions = some_person.positions.all() 
0

你是不是正确的一些人说。当您使用外键时,您声明的模型与其他模型具有一对多关系。在你的情况下,PersonPosition有一对多的关系,这意味着Person可以有很多Positions,但Position只能有一个Person

可以使用RelatedManager访问Positions一个人

要为每个Person访问Positions只是像做

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

要为Person

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

etc... 
相关问题