2016-11-21 2 views
1

私はそれを正しく言い当てることはできませんでしたが、ドキュメントで見つけることはできましたが、新しいオブジェクトを追加する際に、中間の 'スルー'モデルManyToManyFieldにどのように追加するのですか? OneToOneDjango ManyToManyFieldにオブジェクトを追加するときに、 'trough'中間モデルでフィールドを設定する方法は?

また Person_Person

curr_partner分野に関係なく使用されるモデル「通過」(ドキュメントは、それを指定していない)をサポートしている場合、私はわからないだったよう

注は、その再帰的な関係は、私はManyToManyを使用したこと親/子関係のようなオブジェクトを追加する(Personのフィールドがない)(これは、ManyToManyFieldがSQLリレーショナルデータベースの出力テーブルの実際のフィールドであるという混乱のためです)

私のモデルはいくつかのコンテキスト/理論を持っています例えばCALの欠陥が、聞かせてのその抽象今のところ)

Models.py:

class Person(models.Model): 
    objectid = models.AutoField(primary_key=True) 
    name = models.CharField() 
    curr_partner = models.ManyToManyField(
     self, 
     on_delete = models.CASCADE, 
     through = Person_Person, #This lets you define the model that will act as an intermadiary 
     symmetrical = False, #This needs to be set with recursive relationships 
    ) 

class Person_Person(models.Model): 
    person_1 = models.ForeignKey(Person, ondelete=models.CASCADE) 
    person_2 = models.ForeignKey(Person, ondelete=models.CASCADE) 
    relation = models.ChoiceField(   
     ('P', 'Parent'), 
     ('C', 'Child'), 
     ('E', 'Engaged'), 
     ('W', 'Widow'), 
    ) 

問合せ:

#Adding a married couple 

father = Person(name = "John") 
mother = Person(name = "Anna") 

father.curr_partner.add(mother , through.relation = "Engaged") #??? 

#Adding a 'Child' relation 

child = Person(name = "Billy") 

#This makes sense?? 
p1 = Person_Person(person1 = father, person2 = child, relation = "Child") 
p2 = Person_Person(person1 = mother, person2 = child, relation = "Child") 

答えて

1

あなたは関係者のインスタンスを保存することで、関係を作成あなたと同じように(ほとんど)子供たちと一緒にやったようなモデルです。それは実際に人の関係だけではなく、結婚のすべてを表しているので、あなたは、

father = Person(name = "John") 
mother = Person(name = "Anna") 

marriage = Person_Person.objects.create(person1=father, person2=mother, relation="E") 

p1 = Person_Person.objects.create(person1=father, person2=child, relation="C") 
p2 = Person_Person.objects.create(person1 = mother, person2 = child, relation="C") 

ところで、あなたのcurr_partner属性は、正確な名前を持っていないようなものを持っていると思います。たぶん、あなたは人のパートナーを得るためにrelationshipsまたはkindredに名前を変更し、プロパティを持っている必要があります。

@property 
def curr_partner(self): 
    try: 
     return self.relationships.objects.get(relation='E') 
    except Person_Person.DoesNotExist: 
     # No marriage relationship 
     return 
+0

感謝を!私は実際にそれをより良い言葉にしようとしていました – Mojimi

関連する問題