【问题标题】:django unique together does not work with none datetime [duplicate]django unique together 不适用于无日期时间 [重复]
【发布时间】: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 添加了表创建和描述

标签: python django orm model


【解决方案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 的回答。

    【讨论】:

      猜你喜欢
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 2021-03-28
      相关资源
      最近更新 更多