Django——表关系与联合索引,一对一 一对多 多对多

一、一对一

继续上次的

在models中加入:

# 一对一关系
class Userprofile(models.Model):
    id = models.IntegerField(primary_key=True)
    user = models.OneToOneField(User, blank=True, null=True, on_delete=models.SET_NULL)  # 只要表关联,都要有on_delete
    birthday = models.CharField(max_length=100, blank=True, default='')

注意:这里表关联,要加on_delete=models.SET_NULL,然后还要加上null=True,可以是null。

Django——表关系与联合索引,一对一 一对多 多对多_第1张图片
onetoone这里就是一个unique索引。
Django——表关系与联合索引,一对一 一对多 多对多_第2张图片

这里的一对一就是 app_userprofile 中的user_id 和 app_user中的id是一一对应的,每一个用户都只有一个id,并且每一个id也对应唯一的用户。

二、一对多

# 一对多
# 日记表,每个用户可以创建多个日记
class Diary(models.Model):
    id = models.IntegerField(primary_key=True)
    user = models.ForeignKey(User, related_name='diary', on_delete=models.SET_NULL, blank=True, null=True)
    content = models.TextField()
    create_time = models.IntegerField()

日期不仅可以创建为日期类型,还可以创建为整型,就是时间戳。
Django——表关系与联合索引,一对一 一对多 多对多_第3张图片
Django——表关系与联合索引,一对一 一对多 多对多_第4张图片
查看一下创表信息,可以看到app_diary的user_id和app_user的id建立了外键约束,app_diary的user_id会参考app_user的id。

三、多对多

# 多对多
class Group(models.Model):
    id = models.IntegerField(primary_key=True)
    user = models.ManyToManyField(User, related_name='group')  # 没有on_delete
    name = models.CharField(max_length=20)
    create_time = models.IntegerField()

多对多不用加on_delete
Django——表关系与联合索引,一对一 一对多 多对多_第5张图片
多出来两个表

Django——表关系与联合索引,一对一 一对多 多对多_第6张图片
Django——表关系与联合索引,一对一 一对多 多对多_第7张图片
多对多其实是三个表的对应关系,app_group_user就是一个中间表,user会对应里面的user_id,group表对应中间表的group_id。

四、联合索引

例如想在user表中创建联合索引,就在User的类下面继续创建联合索引。

class User(models.Model):
    id = models.IntegerField(primary_key=True)
    username = models.CharField(unique=True, max_length=50, blank=False)
    age = models.SmallIntegerField(default=0)
    phone = models.IntegerField(db_index=True, blank=True, default=0)
    email = models.EmailField(blank=True, default='')
    info = models.TextField()
    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)

    class Meta:
        index_together = ['username', 'phone']

Django——表关系与联合索引,一对一 一对多 多对多_第8张图片
查看是发现多出来了联合索引。

你可能感兴趣的:(Django艰难学习之旅,django,python,后端)