有外键时插入一行

时间:2018-05-16 09:33:20

标签: mysql django

我有以下型号

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帖似乎适合我的问题,但它不起作用。

1 个答案:

答案 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

我们也可以用Django的ORM编写它,如:

hostel = Hostel.objects.get(room_number=14)
MultimeStabila.objects.create(
    room=hostel,
    guest1='a',
    guest2='b',
    guest3='c',
    guest4='d',
    guest5='e'
)

这通常更具可读性,更具声明性,如果您的模型(稍微)发生变化,那么您通常不必重写查询。请注意,您仍然需要解决具有该数字的宿舍不存在或者有多个宿舍的情况。