首页 > 解决方案 > Django 管理面板无法向表中添加任何记录

问题描述

在我的 Django 管理面板中,每当我想在表中添加一些记录时,我都会收到此错误:

/admin/pool/orders/add/ 处的 IntegrityError

(1452,'无法添加或更新子行:外键约束失败(projectname. orders, CONSTRAINT orders_ibfk_3FOREIGN KEY ( user_phone) REFERENCES users( phone) ON DELETE NO ACTION ON UPDATE NO ACTION)')

这是我的模型:

class Orders(models.Model):
    objects = jmodels.jManager()
    product = models.ForeignKey('Products', models.DO_NOTHING)
    user_phone = models.ForeignKey('Users', models.DO_NOTHING, db_column='user_phone')
    order_date = jmodels.jDateField()
    status = models.CharField(max_length=11)
    price = models.CharField(max_length=11)
    count = models.IntegerField()

    class Meta:
        managed = False
        db_table = 'Orders'
        verbose_name_plural = "user orders"

    def __str__(self):
        return '%s------- (%s)' % (self.user_phone,self.status)


class Users(models.Model):
    objects = jmodels.jManager()
    phone = models.CharField(unique=True, max_length=11)
    name = models.CharField(max_length=80)
    family = models.CharField(max_length=80)
    nationalcode = models.CharField(max_length=11, blank=True, null=True)
    city = models.CharField(max_length=80, blank=True, null=True)
    address = models.TextField(blank=True, null=True)
    profilepic = models.TextField(blank=True, null=True)
    profiletext = models.TextField(blank=True, null=True)
    bons = models.CharField(max_length=11, blank=True, null=True)
    charge = models.CharField(max_length=11, blank=True, null=True)
    registerdate = jmodels.jDateField()
    status = models.CharField(max_length=11, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'Users'
        verbose_name_plural = "Users"

    def __str__(self):
        return '%s %s ---- (%s)' % (self.name,self.family,self.phone)

附加: 除此之外,我还有另一个问题。这是我在订单表中有 150 条记录,但我在 Django 管理面板中看不到它们,而是只显示计数。

标签: pythonmysqlsqldjangodjango-admin

解决方案


您的错误可能是由于 STORAGE_ENGIENE 不匹配造成的。我认为有一些 INNODB 表和一些 MyISAM 表。尝试将它们转换为一致的类型。

此外,如果这不是错误,那么它是由于数据库中的前向引用引起的。如果这是原因,那么您可以通过编辑 Django 设置来关闭外键检查:

DATABASES = {
    'default': {
                ...         
               'OPTIONS': {
                         "init_command": "SET foreign_key_checks = 0;",
                },
       }
}

有关更多详细信息,您可以参考这篇文章:Django“无法添加或更新子行:外键约束失败”

编辑:

phone在您的user_phone领域中获得价值,您需要ForeignKey.to_field在您的Orders模型中使用:

user_phone = models.ForeignKey('Users', to_field='phone')

这是必需的,因为 Django 使用模型的主键User将值存储在user_phone模型中Orders。使用上述脚本有助于在外键字段中获取所需字段的值。

这样做时,您需要确保phoneunique=True设置 User 模型的字段。

检查此链接以获取官方 Django 文档to_field


推荐阅读