【问题标题】:NOT NULL constraint failed error when populating foreign key field填充外键字段时出现 NOT NULL 约束失败错误
【发布时间】:2018-06-15 21:47:51
【问题描述】:

我正在尝试运行我编写的脚本以将一些数据从 json 文件移动到我的数据库中,并不断收到相同的错误。

追溯:

Traceback (most recent call last):
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: NOT NULL constraint failed: clan_participant.completed

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "participant_updater.py", line 32, in <module>
    message = participant_updater()
  File "/home/jamtime/clansite/database_updaters.py", line 548, in participant_updater
    update_db()
  File "/home/jamtime/clansite/database_updaters.py", line 512, in update_db
    character=char_obj
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py", line 653, in create
    return super(RelatedManager, self.db_manager(db)).create(**kwargs)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/models/query.py", line 394, in create
    obj.save(force_insert=True, using=self.db)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/models/base.py", line 807, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/models/base.py", line 837, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/models/base.py", line 923, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/models/base.py", line 962, in _do_insert
    using=using, raw=raw)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/models/query.py", line 1076, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1107, in execute_sql
    cursor.execute(sql, params)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/backends/utils.py", line 80, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/home/jamtime/.virtualenvs/clansite/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: clan_participant.completed

数据库存在,并且我已经迁移了所有当前的更改。我也已经在模型的外键字段中设置了 null=Trueblank=True

(参与者模型是一个给出问题的模型)

models.py

class Clan(models.Model):
    # stuff...

class Player(models.Model):
    # stuff...

class ClanMember(models.Model):
    clan = models.ForeignKey(Clan, related_name='ClanMembers')
    player = models.OneToOneField(Player, on_delete=models.CASCADE, primary_key=True, related_name="ClanMember")
    # stuff...

class Character(models.Model):
    player = models.ForeignKey(Player, related_name='Characters')
    # stuff...

class Activity(models.Model):
    characters = models.ManyToManyField(Character, related_name='Activities')
    # stuff...

class Team(models.Model):
    activity = models.ForeignKey(Activity, related_name='Teams', db_index=True)
    # stuff...

class Participant(models.Model):
    related_team = models.ForeignKey(Team, related_name='Participants', db_index=True)
    character = models.ForeignKey(Character, on_delete=models.CASCADE, related_name='ParticipationInstances', null=True, blank=True)
    displayName = models.CharField(max_length=30, default='')

    def __str__(self):
        return str(self.related_team.__str__()+' - '+self.displayName)

脚本中发生错误的部分:

                if not activity.private: # can insert mode separation here
                    try:
                        team = activity.Teams.get(teamId=p_fields["team"])

                    except ObjectDoesNotExist:
                        if int(p_fields["team"]) == -1:
                            team = activity.Teams.create(
                                # stuff...
                                )
                try:
                    if not team.Participants.filter(displayName=p_fields["displayName"]).exists():
                        if mods.Player.objects.filter(membership_id=p_fields["membershipId"]).exists():
                            p_obj = mods.Player.objects.get(membership_id=p_fields["membershipId"])
                        else:
                            p_obj = mods.Player(
                                # stuff...
                                )

                        if p_obj.Characters.filter(char_id=p_fields["characterId"]).exists():
                            char_obj = p_obj.Characters.get(char_id=p_fields["characterId"])

                        else:
                            char_obj = p_obj.Characters.create(
                                # stuff...
                                )

                        new_p = team.Participants.create(         # This part is giving the error
                            displayName=p_fields["displayName"],  # This part is giving the error
                            character=char_obj                    # This part is giving the error, this line specifically
                            )                                     # This part is giving the error

我也尝试过创建对象并在之后添加字符字段,但它在我尝试添加字符字段的行上给出了相同的错误。

卡在这个问题上太久了,非常感谢任何帮助!

【问题讨论】:

    标签: python django django-models sqlite


    【解决方案1】:

    事实证明,在 Participant 模型中有一个布尔字段,其默认设置为 None completed = models.BooleanField(default=None),这对于布尔字段是不可能的。

    【讨论】:

      猜你喜欢
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-31
      • 1970-01-01
      • 2022-12-04
      • 2021-11-19
      相关资源
      最近更新 更多