如何在Django模型中制作独特的?并在Django中索引一列

时间:2009-11-25 00:40:55

标签: python mysql django django-models

这是我简单的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)

如您所见,它链接到“内容”,这是我的文档的表格。 我的问题是:

  • 如何使内容+ ip独一无二......所以 多个内容都可以,但是 多个内容和IP不好 (不希望用户评价两次)。
  • 如何为内容和ip创建数据库索引...因为我将始终选择那些(比较它是否已经在数据库中)。

5 个答案:

答案 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地址代表用户的身份,请不要 - 这是一个非常糟糕的主意。通过其ISP进入的用户将随机更改其IP,因此他们可能会投票两次;连接各种咖啡店,图书馆和笔记本电脑的用户将拥有始终不同的IP;共享连接的用户(例如,公寓伙伴),甚至是从大学校园进来的每一个用户,都可以通过NAT获得相同的IP地址,因此只有一个人可以投票......很难想到任何更糟糕的方式代表个人的身份! - )

如果您对“用户身份”字段使用名称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'), )