Как проверить, был ли создан экземпляр модели 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)
это также сделает поле нередактируемым.