有外键时插入一行

问题描述 投票:1回答:1

我有以下型号

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

mysql django
1个回答
2
投票

Problem with the query

我认为你必须首先分析类型。你写一个像这样的查询:

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,我们只使用第一个单元格。但这仍然不是很优雅而且效率低下:如果有多个宿舍有相同的房间号怎么办?还是没有?你也需要考虑这些因素。

Using Django's 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'
)

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

© www.soinside.com 2019 - 2024. All rights reserved.