django自定义多对多第三张表

最近项目开发有个数据库设计牵涉到多对多第三张表添加字段,之前的项目一直没遇到这样的场景,这里碰到还是有点懵的,好在百度还算强大。

多对多自定义第三张表

我这里直接示例说明大家看的比较直观,现有这样一个场景,用户对每一个自己的粉丝都可以打上一个标签。

改进前

现在我用模型简单的演示下:

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