Django在尝试使用@property方法创建记录时抛出NOT NULL IntegrityError

2024-09-29 21:28:56 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我对Django比较陌生,我正在制作一个以SQLite3作为开发数据库的flashcard应用程序。我有两个模型:一个用于牌组,另一个用于与牌组有外键关系的牌本身。为了知道一副牌中有多少张牌,我用@property decorator创建了一个方法,该方法对card_set运行count()并返回值。在

这是来自模型.py公司名称:

class Deck(models.Model):
    author = models.ForeignKey(User)
    title = models.CharField(max_length=256, blank=True)
    slug = models.SlugField(max_length=256)
    description = models.TextField(blank=True)
    tags = TaggableManager(blank=True)
    dateCreated = models.DateField(auto_now_add=True)
    dateModified = models.DateTimeField(auto_now=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Deck, self).save(*args, **kwargs)

    @property
    def numCards(self):
        return self.card_set.count()

    def __repr__(self):
        return self.title

中的相关函数视图.py(仍在建设中):

^{pr2}$

在我的unittests中,numCards字段按预期工作(即它返回牌堆中正确数量的卡),并且可以创建无卡牌组。但当我试图在我的实际站点中创建一个deck时,Django返回一个IntegrityError,说“notnull约束失败:notecards”_甲板.numCards“(“notecards”是应用程序的名称)。以下是通过的相关测试(使用FactoryBoy):

class TestNotecardViews(TestCase):

    def test_deck_model_numCards(self):
        deck = DeckFactory()
        for i in range(0, 10):
            CardFactory(deck=deck)
        self.assertEqual(10, deck.numCards)

    def test_create_deck(self):
        a = self.client.login(username='auser', password='apass')
        self.assertTrue(a)
        user = User.objects.get(username='auser')

        resp = self.client.post(reverse('create_deck'),
                                {'title': 'Test Deck',
                                 'description': 'The description',
                                 'tags': 'test, test2'})
        self.assertContains(resp, 'success', 1)
        deck = Deck.objects.get(title='Test Deck')
        self.assertEqual(deck.author, user)
        self.assertEqual(deck.description, 'The description')
        self.assertEqual(deck.slug, 'test-deck')
        self.assertCountEqual(deck.tags.names(), ['test', 'test2'])

怎么回事?为什么Django/SQLite抱怨我的numCards“field”为空?在

编辑:以下是完整的回溯:

Environment:


Request Method: POST
Request URL: http://localhost:8000/notecards/create_deck/

Django Version: 1.8.4
Python Version: 3.5.0
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'taggit',
 'notecards')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware')


Traceback:
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  22.                 return view_func(request, *args, **kwargs)
File "C:\Users\murrarc1\Documents\coding\notecardproject\notecardproject\notecards\views.py" in create_deck
  115.             deck.save()
File "C:\Users\murrarc1\Documents\coding\notecardproject\notecardproject\notecards\models.py" in save
  21.         super(Deck, self).save(*args, **kwargs)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\db\models\base.py" in save
  734.                        force_update=force_update, update_fields=update_fields)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\db\models\base.py" in save_base
  762.             updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\db\models\base.py" in _save_table
  846.             result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\db\models\base.py" in _do_insert
  885.                                using=using, raw=raw)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\db\models\manager.py" in manager_method
  127.                 return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\db\models\query.py" in _insert
  920.         return query.get_compiler(using=using).execute_sql(return_id)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql
  974.                 cursor.execute(sql, params)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\db\backends\utils.py" in execute
  79.             return super(CursorDebugWrapper, self).execute(sql, params)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\db\backends\utils.py" in execute
  64.                 return self.cursor.execute(sql, params)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\db\utils.py" in __exit__
  97.                 six.reraise(dj_exc_type, dj_exc_value, traceback)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\utils\six.py" in reraise
  658.             raise value.with_traceback(tb)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\db\backends\utils.py" in execute
  64.                 return self.cursor.execute(sql, params)
File "C:\Users\murrarc1\Documents\coding\notecardproject\env\lib\site-packages\django\db\backends\sqlite3\base.py" in execute
  318.         return Database.Cursor.execute(self, query, params)

Exception Type: IntegrityError at /notecards/create_deck/
Exception Value: NOT NULL constraint failed: notecards_deck.numCards

Tags: djangoinpyselfenvmodelslibsite
1条回答
网友
1楼 · 发布于 2024-09-29 21:28:56

检查实际的数据库结构。您可能已经在模型中创建了先前的numCards字段,并将其迁移到数据库中。当从模型中删除它时,它并没有从数据库中删除。测试将通过,因为它是在自己的数据库上运行的。在

如果数据库中的列存在,请创建迁移以除去它(或者如果您使用的模型没有迁移,只需手动删除该列),或者如果已经进行了迁移,请使用./manage.py migrate命令运行它。在

相关问题 更多 >

    热门问题