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

TIM*_*MEX 9 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)
Run Code Online (Sandbox Code Playgroud)

如您所见,它链接到"内容",这是我的文档的表.我的问题是:

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

ikk*_*ebr 14

关于你的第一个问题:你应该看看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'),)
Run Code Online (Sandbox Code Playgroud)

  • 最好在存储之前将 IP 转换为“int”,并使用“IntegerField”。它将使用更少的空间(我不确定为什么你为 IP 地址分配 200 字节),并允许更大的查询灵活性。您可能还想查看“django- ratings”(http://github.com/dcramer/django- ratings),它可以很好地处理匿名投票和经过身份验证的投票。 (2认同)

Ale*_*lli 7

顺便说一句,如果从您的术语中看出,您使用IP地址代表用户的身份,请不要 - 这是一个非常可怕的想法.通过其ISP进入的用户将随机更改其IP,因此他们可能会投票两次; 连接各种咖啡店,图书馆和笔记本电脑的笔记本电脑上的用户将拥有不断变化的IP; 共享连接的用户(例如,公寓伙伴),甚至是从大学校园进来的每一个用户,都可以通过NAT获得相同的IP地址,因此只有一个人可以投票......很难想到任何更糟糕的方式代表个人的身份! - )

如果您使用ip"用户身份"字段的名称是偶然的,并且与使用IP地址无关,我道歉,但在这种情况下请重命名该字段! - )


Ned*_*der 5

关于索引:您不需要执行任何操作content,因为它是主键,它将被编入索引.对于ip,只需添加db_index=TrueCharField构造函数调用:

ip = models.CharField(max_length=200, blank=True, db_index=True)
Run Code Online (Sandbox Code Playgroud)

有关db_index和其他字段选项的更多信息,请参见此处

  • 我没有回答关于独角兽的问题.问题中的第二个问题是关于索引ip的问题. (3认同)

ads*_*n21 5

这是针对那些使用 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']) ]
Run Code Online (Sandbox Code Playgroud)

因此您可以定义多个约束和索引