Как проверить, был ли создан экземпляр модели django?

Я тестирую api для игры и имею некоторые проблемы с моделью.

Это моя модель:

models.py

class Gamesession(models.Model):
    gamemode = models.ForeignKey(Gamemode, on_delete=models.CASCADE, null=True)
    user = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True)
    gametype = models.ForeignKey(Gametype, on_delete=models.CASCADE)
    created = models.DateTimeField(editable=False)

    objects = models.Manager()

Это набор тестов:

test_models.py

    def setUp(self):
        self.user = CustomUser.objects.create(id=1, username="carina")
        self.gametype = Gametype.objects.create(id=1, name="NewGame", rounds=5, round_duration=60, enabled=True)
        self.gamesession_user = self.user
        self.gamesession_gametype = self.gametype
        self.gamesession_created = datetime.utcnow().replace(tzinfo=pytz.UTC)
        self.gamesession = Gamesession.objects.create(id=1,
                                                      user=self.gamesession_user,
                                                      gametype=self.gamesession_gametype,
                                                      created=self.gamesession_created)

    def test_create_gamesession(self):
        gamesession = Gamesession.objects.create(gametype=self.gametype)
        assert gamesession.gametype == self.gamesession_gametype

Запуск моих тестов продолжает выдавать ошибку: GamesessionTests::test_create_gamesession - django.db.utils.IntegrityError: null value in column "created" of relation "frontend_games

".

Как я могу решить эту проблему? Есть ли лучший способ проверить, создан ли экземпляр модели?

Это происходит потому, что вы определили created как поле, которое не является null=True и без какого-либо default=…, что означает, что ему не присваивается нужное значение. Таким образом, вы можете сконструировать объект с:

def test_create_gamesession(self):
    gamesession = Gamesession.objects.create(
        gametype=self.gametype,
        gamesession_created=self.gamesession_created
    )
    assert gamesession.gametype == self.gamesession_gametype

Вероятно, вы не хотите указывать значение в любом случае, вы можете воспользоваться auto_now_add=True [Django-doc], чтобы указать, что Django должен заполнить временную метку при создании объекта:

>.
class Gamesession(models.Model):
    # …
    created = models.DateTimeField(auto_now_add=True)

это также сделает поле нередактируемым.

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