2013-05-23 2 views
1

Я начинающий Django и знакомлюсь с его использованием, и я также очень верю в модульное тестирование.Django Unit testing, неизвестная ошибка столбца

Учитывая таблицу 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: «Неизвестный co lumn contracts.id в списке полей ". Что именно это значит? Первая ошибка в трассировке стека - это вызов get сразу после первого сохранения.

Вещь, у меня есть тот же самый тест, установленный для другого объекта модели, и тот проходит.

+2

У вас есть первичный ключ в базе данных? Возможно, вам нужно указать, какой из них находится в вашей модели, если это настраиваемое поле, иначе django будет искать поле «id». Как выглядит ваша другая рабочая модель? https://docs.djangoproject.com/ru/dev/topics/db/models/#automatic-primary-key-fields –

+0

согласен с @mshell_lauren. По умолчанию Django всегда будет иметь первичный ключ как «id», вы можете переопределить основное поле в определении поля 'primary_key = True' –

+0

@mshell_lauren, если вы сделаете свой комментарий в качестве ответа, я его приму. Благодарю. – Jason

ответ

1

Обязательно проверьте первичный ключ, заданный в базе данных. Если у вас есть первичный ключ, который находится в поле, которое не помечено как «id» (я смотрю на вас parent_id ...), вам нужно установить это в своей модели. Вы можете сделать это с помощью:

field_name = models.AutoField(primary_key=True) 

Если вы не сделаете этого, то Django будет искать поле «ID», при условии, что у вас есть один, и что это ваш первичный ключ. Я думаю, что вы получаете эту ошибку, потому что она ищет contracts.id, которого нет!

Ознакомьтесь с документами Django по телефону primary-key-fields и legacy databses.