1

我是 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 调用。

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

4

1 回答 1

1

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

field_name = models.AutoField(primary_key=True)

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

查看有关主键字段遗留数据库的 Django 文档。

于 2013-05-24T18:38:46.913 回答