【发布时间】:2013-05-23 16:48:26
【问题描述】:
我是 Django 初学者,并且正在熟悉使用它,而且我也是单元测试的忠实信徒。
给定一个带有字段的示例数据库表contracts
parent_id int
contract_num varchar
start_date date
end_date date
org_name varchar
我使用django_admin.py inspectdb > models.py定义了一个模型类
class Contracts(models.Model):
parent_id = models.IntegerField()
contract_num = models.CharField(max_length=10L, db_column='contract_num')
start_date = models.DateField()
end_date = models.DateField(null=True, blank=True)
org_name = models.CharField(max_length=100L, db_column='org_name')
class Meta:
db_table = 'contracts'
在测试类中,我定义了
def setUp(self):
self.contracts = Contracts(parent_id = 300, contract_num = "1234", start_date = timezone.now(), end_date = None, org_name = "TestContractName")
def test_contracts_access(self):
self.contracts.save()
getContracts = Contracts.objects.get(parent_id = 300)
self.assertEqual(getContracts.org_name, "TestContractName")
self.assertEqual(getContracts.contract_num, "1234")
self.assertEquals(getContracts.contract_num, "12")
getContracts.org_name = "TestContractNameUpdate"
getContracts.save()
updateContract = Contracts.objects.get(contract_num = "1234")
self.assertEqual(updateContract.org_name, "TestContractNameUpdate")
当我运行此测试时,我收到一个数据库错误 1054:“字段列表中的未知列contracts.id”。这到底是什么意思呢?堆栈跟踪中的第一个错误是第一次保存后的 get 调用。
问题是,我为另一个模型对象设置了完全相同的测试,并且通过了。
【问题讨论】:
-
您的数据库中是否设置了主键?如果它是自定义字段,您可能必须指定模型中的哪个字段,否则 django 将查找字段“id”。你的其他工作模型是什么样的? docs.djangoproject.com/en/dev/topics/db/models/…
-
同意@mshell_lauren。默认情况下,Django 将始终将主键作为“id”,您可以覆盖字段定义中的主字段,
primary_key=True -
@mshell_lauren,如果您发表评论作为答案,我会接受。谢谢。
-
@Jason,当然!希望这可以帮助! :)
标签: python django unit-testing django-unittest