2017-02-26 8 views
0

私はDjangoを学習しています。次のシナリオで自分自身を見つけました:私はprojectのモデルをさまざまなフィールドに持っています。そのうちの1つはkey_personnelです。もう1つは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

PersonProjectの間のm2m関係のカスタムthroughモデル/表を使用します(*ラクダとスネークの組み合わせを使用することを拒否しています)。このモデルはForeignKeyからRoleになります。このようにして、人とプロジェクトの間のあらゆる関係は、(再利用可能な)役割によって特徴付けられます。

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(( 'person'、 'project'))'から 'unique_together =(( 'person'、 'project')に変更しなければなりませんでした。' – engineervix

+1

うん、それはタイプミスでした。訂正されました! – schwobaseggl

関連する問題