Тестирование модели Django бросает TypeError

Я пытаюсь протестировать свой REST API и в настоящее время тестирую свои модели. Я очень новичок в Django и в тестировании в частности.

При тестировании моих моделей я продолжаю получать эту ошибку:

TypeError: Field 'id' expected a number but got datetime.datetime(2022, ...)

Я получаю эту ошибку для каждой модели и представления до сих пор.

Почему возникает эта ошибка? Как я могу заставить мои тесты для этой модели работать? Правильно ли я вообще тестирую?

Это одна из моих моделей:

class Tag(models.Model):
    name = models.CharField(max_length=256)
    language = models.CharField(max_length=256)

    objects = models.Manager()

    def __str__(self):
        """Return a human readable representation of the model instance."""
        return self.name or ''

    @property
    def tags(self):
        tags = self.tagging.values('tag')
        return tags.values('tag_id', 'tag__name', 'tag__language')

А вот соответствующий набор тестов для этой модели:

class TagTests(TestCase):
    def setUp(self):
        self.tag_name = "name of the tag"
        self.tag_language = "language of tag"
        self.tag = Tag.objects.create(name=self.tag_name, language=self.tag_language)

    def test_name_label(self):
        tag = Tag.objects.get(id=1)
        field_label = tag._meta.get_field('name').verbose_name()
        self.assertEqual(field_label, 'name')

    def test_tag_size(self):
        tag = Tag.objects.get(id=1)
        max_length = tag._meta.get_field('name').max_length
        self.assertEqual(max_length, 256)

    def test_str(self):
        """Test for string representation"""
        tag = Tag().objects.get(id=1)
        self.assertEqual(str(tag), tag.name)

    def test_model_can_create_tag(self):
        """Test the tagging model can create a tag instance"""
        old_count = Tag.objects.count()
        self.tag.save()
        new_count = Tag.objects.count()
        self.assertNotEqual(old_count, new_count)

Я не вижу места, где вы передаете datetime объект как id.

Но...

Я заметил несколько принципиальных ошибок:

tag = Tag().objects.get(id=1)

Вы создаете объект Tag с помощью ().

Еще один момент. Если вы создаете self.tag = Tag.objects.create() в SetUp, то модель создается для каждого теста в TestCase. Это означает, что вы не можете get объект с ищущим (id=1), потому что база данных одна и та же, но в SetUp она создает новый объект с новым id. Таким образом, вместо:

def test_str(self):
    tag = Tag.objects.get(id=1)
    self.assertEqual(str(tag), tag.name)

Вам следует просто использовать гораздо более безопасный подход:

def test_str(self):
    self.assertEqual(str(self.tag), self.tag.name)

Старайтесь "жестко кодировать" как можно меньше в тестах.

Вернуться на верх