Проверка, равны ли ForeignKeys друг другу - PullRequest
0 голосов
/ 06 июня 2011

У меня есть список кортежей внешних ключей вида [(3,2),(2,3)].И я хочу вставить элементы в таблицу ManyToMany внутри модели:

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), и когда я печатаю перед вставкой, такой кортеж не отображается.Итак, как мне избежать вставки таких кортежей, поскольку они не отображаются в списке до того, как я вставлю их?

1 Ответ

1 голос
/ 06 июня 2011

У вас слишком много параметров для вызова 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...