2011-06-05 106 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") 

,我插入列表(連接)有:

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) 

當我打印打印[(3L, 2L),(2L, 3L)]的列表(例如),但插入表後顯示(2,2),(3,2),(2,3)和(3,3)已被插入。

我試過在代碼中的多個點檢查是否存在一個元組(a,a),並且在插入它之前打印時顯示沒有這樣的元組。那麼,我該如何避免插入這樣的元組,因爲它們在我插入之前甚至不會出現在列表中?

+0

添加周圍conn_1括號,conn_2 – zsong 2011-06-06 01:59:39

+0

在哪裏?在for語句中?所以它在連接中用於(conn_1,conn_2):' – 2011-06-06 04:43:02

回答

1

您在致電add()時有太多參數。它應該是這樣的:

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) 

而且你也不需要通過所有的地方進行迭代,而不是objects.getobjects.filter取決於使用,如果data是否唯一。舉例來說,如果它是唯一的,使用方法:

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

(也可能是unique=True屬性添加到data場)