我有一个django应用程序,它有几个模型可以从非托管数据库中的表中读取数据。
class EmpGroup(models.Model):
id = models.IntegerField(db_column='id', primary_key=True)
staff_group = models.ForeignKey(
StaffGroup,
db_column='staff_group_id',
on_delete=models.PROTECT
)
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
db_column='user_id',
on_delete=models.PROTECT
)
location = models.ForeignKey(
Location,
db_column='base_loc',
on_delete=models.PROTECT
)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
location_name = models.CharField(max_length=50)
def __str__(self):
return f'{self.last_name}, {self.first_name}'
class Meta(object):
managed = getattr(settings, 'UNDER_TEST', False)
db_table = 'control_v_empGroup'
因为该模型是非托管的,所以没有迁移来告诉它创建表
control_v_empGroup
所以当我运行我的测试-我得到的错误是表不存在!
class EmpGroupFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.EmpGroup
id = 1
staff_group = factory.SubFactory(StaffGroupFactory)
user = factory.SubFactory(UserFactory)
location = factory.SubFactory(LocationFactory)
first_name = 'Test'
last_name = 'Grp'
location_name = 'Test'
在我的设置中,我有:
UNDER_TEST = (len(sys.argv) > 1 and sys.argv[1] == 'test')
if UNDER_TEST:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'default-db.sqlite3'),
},
'camp': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'camp-db.sqlite3'),
},
}
else:
DATABASES =
UNDER_TEST
这样我就可以在测试时将数据库与非文本示例中的常规数据库区分开来。测试数据库是SQLlite。
有没有办法强迫Django在测试时为特定的模型设置一个表,而不是在其他时间?
测试非托管模型的最佳方法是什么?