这是我简单的Django数据库模型。这是一个五星评级系统。
class Rating(models.Model):
content = models.OneToOneField(Content, primary_key=True)
ip = models.CharField(max_length=200, blank=True)
rating = models.IntegerField(default=0)
如您所见,它链接到“内容”,这是我的文档的表格。 我的问题是:
答案 0 :(得分:13)
关于你的第一个问题: 您应该查看unique_together,因为这可以解决您的问题。
class Rating(models.Model):
content = models.OneToOneField(Content, primary_key=True)
ip = models.CharField(max_length=200, blank=True)
rating = models.IntegerField(default=0)
class Meta:
unique_together= (('content', 'ip'),)
答案 1 :(得分:7)
如果您对“用户身份”字段使用名称ip
是偶然的,并且与使用IP地址无关,我道歉,但在这种情况下请重命名该字段! - )< / p>
答案 2 :(得分:5)
关于索引:您不需要为content
执行任何操作,因为它是主键,它将被编入索引。对于ip
,只需将db_index=True
添加到CharField
构造函数调用:
ip = models.CharField(max_length=200, blank=True, db_index=True)
有关db_index和其他字段选项here
的详细信息答案 3 :(得分:1)
这是使用Django 3.0+的用户的答案。
最好使用UniqueConstraint(根据文档)来创建唯一身份。
class Rating(models.Model):
...
class Meta:
constraints = [ models.UniqueConstraint(fields=['content', 'ip'], name="unique-content-ip") ]
indexes = [ models.Index(fields=['content', 'ip']) ]
因此,您可以定义多个约束&indexes。
答案 4 :(得分:0)
请尝试使用此关键字:&#34; unique_together&#34;
class PowerBoardSwitches(models.Model):
id = models.AutoField(primary_key=True, verbose_name='Switch id')
powerBoardId = models.ForeignKey(PowerBoardDevice, models.DO_NOTHING, db_column='powerBoardId', verbose_name='Power Board Id')
powerBoardSwitchId = models.IntegerField()
powerBoardSwitchStatus = models.IntegerField()
createdOn = models.DateTimeField(auto_now_add=True, verbose_name='Created on date')
updatedOn = models.DateTimeField(auto_now_add=True, verbose_name='Updated on date')
class Meta:
unique_together = (('powerBoardId', 'powerBoardSwitchId'), )