【问题标题】:Django 3.0.3 IntegrityError FOREIGN KEY constraint failed when making changes to db对 db 进行更改时,Django 3.0.3 IntegrityError FOREIGN KEY 约束失败
【发布时间】:2020-08-17 20:46:13
【问题描述】:

我的数据库中有两个模型,一个“Account”模型(这是一个自定义用户模型)和一个“Return”模型。

在添加“返回”模型之前,我的数据库运行良好,该模型与“用户”模型具有外键关系,我怀疑这是导致问题的原因。 (每个回报都属于现有用户。在管理面板中,选项框填充了现有用户,所以我认为这工作正常?)

感谢任何帮助!

错误:

IntegrityError at /admin/returns/return/add/

外键约束失败

请求方法:POST 请求网址:http://127.0.0.1:8000/admin/returns/return/add/ Django 版本:3.0.3 异常类型:IntegrityError 异常值:

外键约束失败

这是我的 Return 应用的 models.py:

from django.db import models

from django.contrib.auth import get_user_model
User = get_user_model()

# Create your models here.
class Return(models.Model):
    user = models.ForeignKey(User, related_name="returns", on_delete=models.PROTECT)
    created_at = models.DateTimeField(auto_now=True)
    last_edited = models.DateTimeField(null=True)

    TAX_YEAR_CHOICES = [
    ('2019', '2019'),
    ('2020', '2020'),
    ('2021', '2021'),
    ]

    tax_year_ending = models.CharField(
        choices=TAX_YEAR_CHOICES,
        max_length=4,
        blank=False,
        null=False,
    )

    RETURN_STATUS_CHOICES = [
    ('1', 'In progress'),
    ('2', 'Completed, awaiting review'),
    ('3', 'Completed, under review'),
    ('4', 'Completed, awaiting client action'),
    ('5', 'Submitted to HMRC'),
    ]

    return_status = models.CharField(
        choices=RETURN_STATUS_CHOICES,
        max_length=1,
        default=1,
        blank=False,
        null=False,
    )

这是我的自定义用户类(也在 settings.py 中设置):

class Account(AbstractBaseUser):
    email = models.EmailField(verbose_name='email', max_length=60, unique=True) # tells Django this is the unique ID

    #following required for the AbstractBaseUser class
    date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    #tell django we want to use email as our username field (for logins)
    USERNAME_FIELD = 'email'

    #tells Django to user AccountManager
    objects = AccountManager()

    #tell django which fields are required on registration:
    #REQUIRED_FIELDS = []

    #what to return when we print the Account object
    def __str__(self):
        return self.email

#following required for AbstractBaseUser class
    #does the user have permissions, yes if is_admin
    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

这是来自错误日志的发布请求信息: 用户

'3'

last_edited_0

'2020-05-03'

last_edited_1

'13:01:23'

tax_year_ending

'2019'

返回状态

'3'

_addanother

'保存并添加另一个'

(我已经确认有一个 pk '3' 的用户)

再次感谢,非常感谢。

【问题讨论】:

    标签: python django database sqlite


    【解决方案1】:

    你需要代表pk号记录user的实例:

    User.objects.get(pk=3)
    

    【讨论】:

    • 嗨 Renaud,非常感谢您的回答,非常感谢。你能更详细地解释一下吗?我正在尝试从管理区域更改我的数据库。此外,必须记录特定的 pk 编号也没有意义,因为这将根据我正在编辑的“返回”属于哪个用户而改变?希望这是有道理的,再次感谢!
    • 根据我在 django 网站上的理解 docs.djangoproject.com/fr/2.2/topics/db/examples/many_to_one ForeignKey 字段应该包含链接表对象的实例(用于数据完整性),以使其简单,它的工作方式与您无法在整数字段。记录实例一开始可能是一项艰巨的操作,但可以为您提供很好的功能,即无需在 User 表中搜索即可访问 User 对象的所有字段。不幸的是,我没有使用管理区域来更改分贝,所以我不知道如何进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2021-07-03
    • 2021-09-13
    • 1970-01-01
    • 2022-10-17
    相关资源
    最近更新 更多