2011-06-05 9 views
0

私は[(3,2),(2,3)]の形式の外部キーのタプルのリストを持っています。そして私は、モデル内の多対多のテーブルに項目を挿入する:ForeignKeysが互いに等しいかどうかを確認する

class Place(models.Model): 
    data=models.IntegerField() 
    connected_to=models.ManyToManyField('self') 

class PlaceMeta(models.Model): 
    place=models.ForeignKey("places.Place") 

と私はとのリスト(接続)を挿入しています:私は(それが[(3L, 2L),(2L, 3L)]を印刷し、リストを印刷するとき

places=Place.objects.all() 

for conn_1, conn_2 in connections: 
     for place in places: 
      if place.data == conn_1 and conn_1 != conn_2: 
       place.connected_to.add(conn_1, conn_2) 
      elif place.data == conn_2 and conn_1 != conn_2: 
       fixture.connected_to.add(conn_2, conn_1) 

を(2)、(3,2)、(2,3)、(3,3)が挿入されていることを示しています。

タプル(a、a)が存在するかどうかをチェックするコード内の複数の箇所で試してみました。挿入する前に印刷するとそのようなタプルは表示されません。では、挿入する前にリストに存在しないように見えるようなタプルを挿入するのを避けるにはどうすればよいですか?

+0

がconn_1の周りに括弧を追加conn_2 – zsong

+0

(そしておそらくdataフィールドにunique=True属性を追加しますか)? for文の中で?コネクションの中では 'for(conn_1、conn_2)です:' –

答えて

1

add()に1つのパラメータがあまりにも多すぎます。それは次のようになります。

if place.data == conn_1 and conn_1 != conn_2: 
    # place is the Place instance described by conn_1. 
    # Let's connect it to conn_2! 
    place.connected_to.add(conn_2) 

そして、あなたはdataが一意であるかどうかによって、objects.getまたはobjects.filterを使用する代わりに、すべての場所を反復処理する必要はありません。それが一意である場合、例えば、使用:

for source, target in connections: 
    Place.objects.get(data=source).connected_to.add(Place.objects.get(data=target))