1

私は Django の初心者であり、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 呼び出しです。

つまり、別のモデルオブジェクトに対してまったく同じテストをセットアップし、そのテストに合格しました。

4

1 に答える 1

1

データベースに設定されている主キーを確認してください。「id」というラベルが付いていないフィールドに主キーがある場合 (私はあなたを見ていますparent_id...)、モデルでこれを設定する必要があります。あなたはこれを行うことができます:

field_name = models.AutoField(primary_key=True)

これを行わない場合、Django はフィールド "id" を探します。これは、フィールドがあり、それが主キーであると想定します。contracts.id存在しないものを探しているため、このエラーが発生していると思います!

primary-key-fieldslegacy databaseesに関する Django ドキュメントを確認してください。

于 2013-05-24T18:38:46.913 に答える