最近项目开发有个数据库设计牵涉到多对多第三张表添加字段,之前的项目一直没遇到这样的场景,这里碰到还是有点懵的,好在百度还算强大。
多对多自定义第三张表 我这里直接示例说明大家看的比较直观,现有这样一个场景,用户对每一个自己的粉丝都可以打上一个标签。
改进前 现在我用模型简单的演示下:
1 2 3 4 5 6 7 8 class Users (models.Model): """用户表""" name = models.CharField(max_length=100 ) class Fans (models.Model): """粉丝表""" name = models.CharField(max_length=100 ) users = models.ManyToManyField(Users)
这样数据库中就会给我们生成3张表:用户表;粉丝表;用户与粉丝表(显示用户和粉丝的主键对应关系)。
如果我要给粉丝打标签怎么办?标签写到粉丝表里肯定不行,因为多对多,会把其他用户的粉丝标签也改掉,所以直接能住第三张表加字段。
改进后 1 2 3 4 5 6 7 8 9 10 11 12 13 class Users (models.Model): """用户表""" name = models.CharField(max_length=100 ) class Fans (models.Model): """粉丝表""" name = models.CharField(max_length=100 ) class UserFans (models.Model): """用户-粉丝关系表""" user = models.ForeignKey(Users) fan = models.ForeignKey(Fans) tag = models.CharField(max_length=100 )
以上就能满足我们要求了,能查到指定标签下的所有粉丝,也能查到某个粉丝属于哪个标签
关联指定字段 上述设计看似很美好,其实使用起来并不见很方便,比如用户关联一个粉丝的话必须填写tag,文本形式哟,哪怕其他粉丝有这个标签,你依然要重写一遍。那我们能不能预设好一批标签,让其选择呢?当然可以,改改改嘛
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Users (models.Model): """用户表""" name = models.CharField(max_length=100 ) class Fans (models.Model): """粉丝表""" name = models.CharField(max_length=100 ) class Tags (models.Model): """标签表""" tag_id = models.UUIDField(auto_created=True , default=uuid4, editable=False , unique=True , db_index=True ) name = models.CharField(max_length=100 ) class UserFans (models.Model): """用户-粉丝关系表""" user = models.ForeignKey(Users) fan = models.ForeignKey(Fans) tag = models.ForeignKey(Tags, to_field="tag_id" )
看起来怪怪的是吗?这就对了,我本来就是演示关联指定字段的,按以上场景使用默认关联主键就可以了。
记得关联指定字段参数为to_field
哟