【问题标题】:django foreign key Cannot assign must be a instancedjango外键不能分配必须是实例
【发布时间】:2018-07-17 11:55:56
【问题描述】:

我正在使用 Django 开发一个网络应用程序。我已经在 MySQL 数据库中创建了表,然后使用 inspectdb 生成了 models.py。我能够毫无问题地获取详细信息并连接到数据库。但是在将值保存到特定表时,会显示以下错误

sav_list = List(id=4, item_name ='name1', item_desc='desc1', location='location', reason='rfp',  pid=3)

无法分配“3”:“List.id”必须是“Order”实例。

我的模型

class List(models.Model):
    id = models.IntegerField(db_column='ID', primary_key=True)  # Field name made lowercase.
    item_name = models.CharField(db_column='Item_Name', max_length=255)  # Field name made lowercase.
    item_desc = models.CharField(db_column='Item_Desc', max_length=300)  # Field name made lowercase.
    location = models.CharField(db_column='Location', max_length=100, blank=True, null=True)  # Field name made lowercase.
    reason = models.CharField(db_column='Reason', max_length=100, blank=True, null=True)  # Field name made lowercase.
    pid = models.ForeignKey('Order', models.DO_NOTHING, db_column='PID')  # Field name made lowercase.

class Order(models.Model):
    poid = models.IntegerField(db_column='POID', primary_key=True)  # Field name made lowercase.
    po = models.CharField(db_column='PO', unique=True, max_length=20)  # Field name made lowercase.
    quote = models.CharField(db_column='Quote', unique=True, max_length=20)  # Field name made lowercase.
    condition = models.CharField(db_column='Condition', max_length=15)  # Field name made lowercase.

我已经为外键尝试了相关名称,但仍然是相同的行为。相同的值可以毫无问题地存储在数据库中。只有 Django 会抛出错误。

请有人帮助我!!!

【问题讨论】:

  • 试试pid_id,因为它是相关领域
  • 使用 Django 进行开发的典型方式是创建模型并让 Django 的迁移处理数据库的创建和更改。 Django 也会自己创建一个主键,所以通常不需要手动创建一个。
  • 谢谢@ThatBird。它奏效了。

标签: python django foreign-keys


【解决方案1】:

您应该粘贴实际错误;推测“List.pid”必须是“Order”实例。

错误应该很清楚。 pid 是一个 ForeignKey 字段,它需要一个相关模型的实例。您可以获取项目并设置它:

pid = Order.objects.get(pk=3)
List(...., pid=pid)

或使用底层 id 字段:

List(...., pid_id=3)

【讨论】:

  • 抱歉没有粘贴正确的错误。非常感谢你的帮助。有效。我已将其更改为 PID_ID。简单的错误..
【解决方案2】:

Django 级别的pid 列不是id(整数),是的,在数据​​库级别它是。但在 Django 中,它是一个外键,因此它指的是一个 Order 实例。因此,您应该向它传递一个Order 实例(对应于poid=3 的实例)。

但我们很幸运,如果你构造了这样的ForeignKey,Django 会自动创建一个存储 id 的field_id 列,这两个字段就像双胞胎一样。因此,我们可以将3 分配给pid_id

sav_list = List(
    id=4,
    item_name ='name1',
    item_desc='desc1',
    location='location', reason='rfp',
    pid_id=3
)

但是请注意,对于大多数数据库后端,外键约束 将检查是否存在具有引用列(在 Django 中为主键)3Order 实例。如果没有,就不可能创建这样的List。因此,我建议在尝试将其保存到数据库之前确保此类 Order 存在。

【讨论】:

  • 感谢我使用了 model_id 而不是 model,它适用于迁移。我知道模型在迁移时是特殊的,并且是从状态中获取它们的,所以这一定是保存它们的技巧。
猜你喜欢
  • 1970-01-01
  • 2019-08-20
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 2015-01-05
  • 2013-12-18
  • 2021-05-05
相关资源
最近更新 更多