【问题标题】:Django Unit testing, unknown column errorDjango单元测试,未知列错误
【发布时间】: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


【解决方案1】:

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

field_name = models.AutoField(primary_key=True)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多