我有以下型号
class Hostel(models.Model):
class Meta:
unique_together = (('name ', 'room_number'),)
name = models.CharField(max_length=30, choices=HOSTELS)
room_number= models.IntegerField()
faculty = models.CharField(max_length=40, choices=FACULTIES, blank=True)
def __str__(self):
return self.faculty + ': ' + self.name + ' - ' + str(self.room_number)
class MultimeStabila(models.Model):
room = models.ForeignKey(Hostel, primary_key=True)
guest1= models.CharField(max_length=30)
guest2= models.CharField(max_length=30)
guest3= models.CharField(max_length=30, blank=True, default="")
guest4= models.CharField(max_length=30, blank=True, default="")
guest5= models.CharField(max_length=30, blank=True, default="")
def __str__(self):
return self.guest1+ ' - ' + self.guest2+ ' - ' + self.guest3+ ' - ' + self.guest4 + ' - ' + self.guest5
现在我想在MultimeStabila表中插入a,b,c,d,e 14号房间的客人
c = conn.cursor()
c.execute("SELECT * from stable_hostel where room_number = %s", [14])
data = c.fetchall()
c.execute("INSERT INTO stable_multimestabila(hostel_id, guest1, guest2, guest3, guest4, guest5) VALUES(%s, 'a', 'b', 'c', 'd', 'e')", [data[0]])
conn.commit()
但它告诉我
(1241, 'Operand should contain 1 column(s)')
我哪里错了?提前致谢
P.S。:我看到this帖似乎适合我的问题,但它不起作用。
答案 0 :(得分:2)
我认为你必须首先分析类型。你写了一个像这样的查询:
SELECT * from stable_hostel where room_number = 14
你对此进行了fetchall
。因此,您将获得一组行。每一行都是一组细胞。
现在,如果您使用[data[0]]
,这意味着您使用整个行构建了列表,而下一个SQL语句只需要一行值:id
。我们可以通过以下方式解决这个问题:
c = conn.cursor()
c.execute("SELECT id from stable_hostel where room_number = %s", [14])
data = c.fetchall()
c.execute("INSERT INTO stable_multimestabila(hostel_id, guest1, guest2, guest3, guest4, guest5) VALUES(%s, 'a', 'b', 'c', 'd', 'e')", [data[0][0]])
conn.commit()
所以我们只获取id
,我们只使用第一个单元格。但这仍然不是很优雅而且效率低下:如果有多个宿舍有相同的房间号怎么办?还是没有?你也需要考虑这些因素。
我们也可以用Django的ORM编写它,如:
hostel = Hostel.objects.get(room_number=14)
MultimeStabila.objects.create(
room=hostel,
guest1='a',
guest2='b',
guest3='c',
guest4='d',
guest5='e'
)
这通常更具可读性,更具声明性,如果您的模型(稍微)发生变化,那么您通常不必重写查询。请注意,您仍然需要解决具有该数字的宿舍不存在或者有多个宿舍的情况。