【问题标题】:Django - Unique Together raises error.Django - Unique Together 引发错误。
【发布时间】:2018-05-08 02:33:16
【问题描述】:

我正在关注 Django 应用程序的书籍教程(关键字:TDD,链接:here,作者:Harry Percival),我做了一些小改动,现在破坏了我的代码。

测试

def test_saves_same_game_with_different_players(self):
    player1 = Player.objects.create(name="Player1")
    player2 = Player.objects.create(name="Player2")
    Game.objects.create(player=player1, text="score: other_player")
    game2 = Game.objects.create(player=player2, text="score: other_player")
    game2.full_clean()  # Should not raise.

型号

class Player(models.Model):
  name    = models.TextField(default="")
  objects = models.Manager()

  def __str__(self):
    return self.name

class Game(models.Model):
  player = models.ForeignKey(Player, default=None)
  text   = models.TextField(default="", unique=True)

  objects = models.Manager()

  def __str__(self):
    return self.text

  class Meta:
    ordering = ("id",)
    unique_together = ("player", "text")

错误

...
game2 = Game.objects.create(player=player2, text="score: other_player")
...
IntegrityError: UNIQUE constraint failed: games_game.text

还有sqlite。 使用相同文本创建第二个游戏时,错误与 unique_together 约束有关。但即使玩家有不同的名字,甚至使用名字作为字符串表示,也会发生这种情况。

有人知道该怎么做吗?感谢您的耐心等待。
干杯。

【问题讨论】:

  • 您的text 字段上有一个unique=True,并且您创建了两个具有相同text 字段的游戏。

标签: django django-models unique-constraint


【解决方案1】:

text = models.TextField(default="", unique=True)

这是您的代码失败的地方,因为您将文本作为唯一字段。

【讨论】:

  • 哦哦。所以 unique_together 甚至没有成功。谢谢!
猜你喜欢
  • 2011-05-25
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2017-04-03
  • 2013-12-18
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多