【问题标题】:Insert a row when you have a foreign key有外键时插入一行
【发布时间】:2018-05-16 09:33:20
【问题描述】:

我有以下型号

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

现在我想在 14 号房间的 MultimeStabila 表 a、b、c、d、e 客人中进行插入

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

【问题讨论】:

  • 您使用原始查询而不是 Django 的 ORM 是否有特定原因?
  • 主要原因是到目前为止我还没有使用任何ORM,我发现这种方式更容易。
  • @Siviu:这实际上会抵消 Django 的大部分好处。如果您稍后迁移模型,则可能需要重写所有查询。
  • 从现在开始我会尝试使用ORM,谢谢:)

标签: mysql django


【解决方案1】:

查询问题

我认为你必须先分析类型。您编写如下查询:

SELECT * from stable_hostel where room_number = 14

然后您对其执行fetchall。结果,您将获得一组行。每一行都是一个单元格的集合。

现在,如果您使用[data[0]],这意味着您构造了一个带有 整个 行的 list,而下一个 SQL 语句只需要 一个 em> 值: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'
)

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

【讨论】:

  • 感谢您的回答,非常有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2013-05-14
  • 2015-07-17
  • 1970-01-01
相关资源
最近更新 更多