我有一个[(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),并且在插入之前打印时它显示没有这样的元组。那么我如何避免插入这样的元组,因为它们在我插入之前甚至看起来都不存在?
答案 0 :(得分: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
字段)