2017-02-26 61 views
0

我在学习Django,并且在以下场景中发现自己:我有一个带有各种字段的project模型。其中之一是key_personnel。另一个是key_person_roles,它定义了每个关键人员在项目中扮演的角色。只有当它是另一个模型的一部分时,才将模型字段指定给模型

  • 一个项目可以有各种关键人员,每个关键人员可以有不同的角色。
  • 主要人员没有默认角色,他们可以在不同的项目上扮演任何角色。

我该如何在Django中最好地模拟此场景?我似乎无法找到如何对这种情况建模的例子。这里是我的models.py

from django.db import models 
from phonenumber_field.modelfield import PhoneNumberField 


class Key_Person(models.Model): 
    name = models.CharField(max_length=200) 
    designation = models.CharField(max_length=100) 
    email = models.EmailField() 
    contact = PhoneNumberField()   

    class Meta:    
     ordering = ['name'] 
     verbose_name_plural = "Key Persons" 


    def __unicode__(self):    
     return self.name 


class Key_Person_Role(models.Model):   
    role = models.CharField(max_length=100)   

    class Meta:    
     verbose_name_plural = 'Key Person Roles'   

    def __unicode__(self): 

     return self.role 


class Project(models.Model): 

    title = models.CharField(max=150) 
    description = models.TextField() 
    # more fields here ...   
    key_persons = models.ManyToManyField(Key_Person) 

    # What I want is to assign a role to each key person above. 
    key_person_roles = models.ManyToManyField(Key_Person_Role)   

    def __unicode__(self): 

     return self.title 

我感谢您的帮助。

回答

1

我会使用一个自定义的through模型/表PersonProject之间的M2M关系(*拒绝使用你的骆驼和蛇情况下混合)。这个模型可以有一个ForeignKeyRole。这样,一个人和项目之间的每种关系都具有(可重复使用的)角色的特征:

class Person(models.Model): 
    .... 

# model to capture the different types of roles 
class Role(models.Model): 
    name = models.CharField(max_length=100)  

class Project(models.Model): 
    # specify custom through model 
    key_persons = models.ManyToManyField('Person', through='ProjectPerson') 

# m2m-model for project-person relation 
class ProjectPerson(models.Model): 
    person = models.ForeignKey('Person', ...)  
    project = models.ForeignKey('Project', ...) 
    # such a relation has a role! 
    role = models.ForeignKey('Role', ...) 

    class Meta: 
     unique_together = (('person', 'project'),) 
+0

感谢您的帮助。这完美的作品!对于管理员部分,[我在文档中找到了这个](https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#working-with-many-to-many-intermediary-models)。 – engineervix

+0

我不得不从'unique_together(('''','project'),)''改为'unique_together =(('''','project'),') – engineervix

+1

是的,那是一个错字。更正! – schwobaseggl

相关问题