django unique together 不适用于无日期时间 [重复]
Posted
技术标签:
【中文标题】django unique together 不适用于无日期时间 [重复]【英文标题】:django unique together does not work with none datetime [duplicate] 【发布时间】:2013-12-18 05:57:51 【问题描述】:我正在使用 django 1.5.5 和 python 2.7 和 mysql
这是我的模特
class Foo(models.Model):
user = models.ForeignKey(User)
date = models.DateTimeField(null=True, blank=True,editable=True)
class Meta:
unique_together = ('user', 'date')
如果我使用它,我可以添加 2 条具有相同用户和空日期的记录。 我希望即使对于空日期也能强制执行唯一性。
建表命令
CREATE TABLE `management_foo`
( `id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_id` (`user_id`,`date`),
KEY `management_foo_6232c63c` (`user_id`),
CONSTRAINT `user_id_refs_id_d47e5747` FOREIGN KEY (`user_id`)
REFERENCES `auth_user` (`id`))
ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
和表格描述
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | NO | MUL | NULL | |
| date | datetime | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
【问题讨论】:
这张表在 DB 中的外观如何? @akaRem 两个记录在数据库中的日期都为空 @Alasdair 回答谈到 Postgresql @yossi 我的意思是DESCRIBE "foo";
@akaRem 添加了表创建和描述
【参考方案1】:
在 InnoDB 中,每个 NULL 都被视为唯一值。
示例:
mysql> create table x (i int, j int, primary key (i), unique key (j));
mysql> insert into x (i,j) values (NULL,NULL);
ERROR 1048 (23000): Column 'i' cannot be null
mysql> insert into x (i,j) values (1,NULL);
mysql> insert into x (i,j) values (2,NULL);
mysql> insert into x (i,j) values (3,3);
mysql> select * from x;
+---+------+
| i | j |
+---+------+
| 1 | NULL |
| 2 | NULL |
| 3 | 3 |
+---+------+
3 rows in set (0.01 sec)
mysql> insert into x (i,j) values (4,3);
ERROR 1062 (23000): Duplicate entry '3' for key 'j'
您需要添加not null
约束从字段定义中删除null=True
(例如将其替换为默认值)
顺便说一句,最好写成这样的风格:unique_together = (("field1", "field2"),)
- 扩展唯一对会容易得多
【讨论】:
【参考方案2】:仅作记录:SQL 标准规定NULL
不是 值,因此不得考虑unique
约束。 IOW 它与 Django 无关,实际上 是 预期的行为。
有关技术解决方案,请参阅 akaRem 的回答。
【讨论】:
以上是关于django unique together 不适用于无日期时间 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
UniqueConstraint 与 unique_together 之间的区别 - Django 2.2?
约束 unique_together 可能与 django 类中的唯一字段冲突
如何在 django 中使用 Uniqueconstraints 函数创建 unique_together 索引?
Django 数据库模型“unique_together”不起作用?