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)
如您所见,它链接到"内容",这是我的文档的表.我的问题是:
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地址代表用户的身份,请不要 - 这是一个非常可怕的想法.通过其ISP进入的用户将随机更改其IP,因此他们可能会投票两次; 连接各种咖啡店,图书馆和笔记本电脑的笔记本电脑上的用户将拥有不断变化的IP; 共享连接的用户(例如,公寓伙伴),甚至是从大学校园进来的每一个用户,都可以通过NAT获得相同的IP地址,因此只有一个人可以投票......很难想到任何更糟糕的方式代表个人的身份! - )
如果您使用ip"用户身份"字段的名称是偶然的,并且与使用IP地址无关,我道歉,但在这种情况下请重命名该字段! - )
关于索引:您不需要执行任何操作content,因为它是主键,它将被编入索引.对于ip,只需添加db_index=True到CharField构造函数调用:
ip = models.CharField(max_length=200, blank=True, db_index=True)
Run Code Online (Sandbox Code Playgroud)
有关db_index和其他字段选项的更多信息,请参见此处
这是针对那些使用 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)
因此您可以定义多个约束和索引。
| 归档时间: |
|
| 查看次数: |
3927 次 |
| 最近记录: |