【发布时间】:2018-11-06 06:14:57
【问题描述】:
我想编写一个抽象模型 mixin,我可以用它来建立 OneToOne - 与用户模型的关系。这是我的代码:
from django.conf import settings
from django.db import models
class Userable(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
class Meta:
abstract = True
我为此模型编写了以下测试:
class TestUserable(TestCase):
mixin = Userable
def setUp(self):
user = User.objects.create_user(
email="testuser@test.com",
name="Test User",
password="test1234test"
)
self.user = user
self.model = ModelBase(
'__TestModel__' + self.mixin.__name__, (self.mixin,),
{'__module__': self.mixin.__module__}
)
with connection.schema_editor() as schema_editor:
schema_editor.create_model(self.model)
def test_user(self):
self.model.objects.create(user=self.user)
self.assertEqual(self.model.objects.count(), 1)
def tearDown(self):
with connection.schema_editor() as schema_editor:
schema_editor.delete_model(self.model)
我的问题是,tearDown() 方法中的这个测试会引发以下错误:
django.db.utils.OperationalError: cannot DROP TABLE "core___testmodel__userable" because it has pending trigger events
这可能是什么原因?我确实运行了 python manage.py makemigrations 和 python manage.py migrate,但没有待处理的迁移(正如预期的那样,因为这是一个抽象模型)。
编辑:它似乎与 OneToOneFields 或 ForeignKeys(关系)有关。如果我将此代码用于常规字段(如 CharFields 或 IntegerFields),则它可以工作。
EDIT2:如果您有另一种更好的方法来测试使用 ForeignKeys 的抽象基础模型,请告诉我!
【问题讨论】:
-
如果你没有在
setUp..中重新分配self.model,那会不会那么混乱。 -
那是什么意思?第一个模型设置为Userable,然后设置为self.model?我可以用 mixin 或其他东西替换第一个 model=Userable :)
-
mixin会更清楚.. -
我编辑了,谢谢你的建议。你知道如何解决这个问题吗?
-
很遗憾没有,不过我也对答案感兴趣..
标签: django django-models django-testing django-migrations django-tests