当我们遇到多对多关系时,我们就立马会想到创建第三张表来维护多对多的关系,比如,角色<-->用户<-->权限等
我们都知道对于django中ManyToMany字段,Django会自动为我们创建第三张表,默认情况下,django会如何给我们生成第三张表呢?
请看代码:
class User(models.Model): name = models.CharField(max_length=20) class Role(models.Model): name = models.CharField(max_length=20) user = models.ManyToManyField(User)
我们执行makemigrations和migrate之后,数据库中会出现三张表:
会自动生成了appname_role_user第三张表,这张表中仅有三个字段
CREATE TABLE `djangostudy_role_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `djangostudy_role_user_role_id_user_id_87ad35e5_uniq` (`role_id`,`user_id`),
KEY `djangostudy_role_user_user_id_a60336ee_fk_djangostudy_user_id` (`user_id`),
CONSTRAINT `djangostudy_role_user_role_id_4164146a_fk_djangostudy_role_id` FOREIGN KEY (`role_id`) REFERENCES `djangostudy_role` (`id`),
CONSTRAINT `djangostudy_role_user_user_id_a60336ee_fk_djangostudy_user_id` FOREIGN KEY (`user_id`) REFERENCES `djangostudy_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
一般情况下这种情况能满足我们的要求,但是有时候我们需要在第三张表中添加一些其他字段,例如create_time,status等,这个时候该如何创建呢?
django为我们提供了through参数,用于指定中间模型,如下:
class User(models.Model): name = models.CharField(max_length=20) class Role(models.Model): name = models.CharField(max_length=20) user = models.ManyToManyField(User, through="UserRole") class UserRole(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) role = models.ForeignKey(Role, on_delete=models.CASCADE) create_time = models.DateField(auto_now_add=True)
此时会生成djangostudy_userrole第三张表:
CREATE TABLE `djangostudy_userrole` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`create_time` date NOT NULL,
`role_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `djangostudy_userrole_role_id_f907649a_fk_djangostudy_role_id` (`role_id`),
KEY `djangostudy_userrole_user_id_87ea858c_fk_djangostudy_user_id` (`user_id`),
CONSTRAINT `djangostudy_userrole_role_id_f907649a_fk_djangostudy_role_id` FOREIGN KEY (`role_id`) REFERENCES `djangostudy_role` (`id`),
CONSTRAINT `djangostudy_userrole_user_id_87ea858c_fk_djangostudy_user_id` FOREIGN KEY (`user_id`) REFERENCES `djangostudy_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;