Django单元测试,未知列错误

时间:2013-05-23 16:48:26

标签: python django unit-testing django-unittest

我是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:“字段列表中的未知列contract.id”。这到底是什么意思呢?堆栈跟踪中的第一个错误是第一次保存后的get调用。

事情是,我为另一个模型对象设置了完全相同的测试,并且通过了。

1 个答案:

答案 0 :(得分:1)

确保检查数据库中设置的主键。如果您的主键位于未标记为“id”的字段上(我正在查看您parent_id ...),则需要在模型中设置此键。你可以这样做:

field_name = models.AutoField(primary_key=True)

如果你不这样做,那么Django将寻找字段“id”,假设你有一个并且它是你的主键。我认为你收到此错误是因为它正在寻找不存在的contracts.id

查看primary-key-fieldslegacy databses上的Django文档。