2011-06-05 3 views
0

У меня есть список кортежей внешних ключей формы [(3,2),(2,3)]. И я хочу, чтобы вставить элементы в таблицу ManyToMany в модели:Проверка того, что 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

+0

где? в заявлении for? так что это 'for (conn_1, conn_2) в соединениях:' –

ответ

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.get или objects.filter в зависимости, если data уникален или нет. Например, если он уникален, используйте:

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

(и, вероятно, добавить атрибут unique=True в data поле)

Смежные вопросы