2017-02-26 63 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

相關問題