django 表结构

                    django 表结构

一:查看orm写的sq语句:如果对某个语句不清楚的话可以调用queryset的的query方法来查看sql。

1 obj=Hostinfo.objects.filter(id=val).values(id)
2 print(obj.query)

dbsqlite在创建的时候,系统自动创建了一些表和数据库:

其中我们比较熟悉的django_session 储存用户session的表。

二:修改表结构

django的orm和sqlalchemy的区别:

前者可以不借助第三方的插件进行修改表结构,而sqlachemy需要借助第三方模块才能修改表结构。django修改完之后,需要执行如下命令:

1、python  manager.py  makemigration

2、 python  manager.py  makemigrate

三:django的表结构关系。

a:多对一。这里和sqlalchemy的区别的是,在sqlalchemy中 是一对多,这里一对多还是多对一,其实就是foreign key的建立在哪个表中。

在django中,foreign key是建立在“多”的表中。如下:

一个用户的类型只有一个,一个类型对应多个用户。在django中外键建立在多的关系中。如下:

 1 from django.db import models
 2 
 3 # Create your models here.
 4 class  User(models.Model):
 5     username=models.CharField(max_length=32)
 6     pwd=models.CharField(max_length=32)
 7     user_type=models.ForeignKey('User_type')
 8     
 9 class   User_type(models.Model):
10     user_type=models.CharField(max_length=32)

 注意:1、如果列的类型是:CharField的话,需要指定字符串的长度。即必须有:max_length参数。

    2、在建立外键的时候如上:user_type=models.ForeignKey('User_type') 参数中 带引号和不带引号,不带引号,下面的"一"的表需要放在“多”的表前面,带引号,则没这个顺序要求。

b:多对多,ManyToMany 多对多情况。

多对多情况,在sqlalchemy中需要我们手动创建第三张表,但是在django中默认创建第三张表,也可以我们手动创建第三表。

比如:抽屉项目中的,新闻表中的点赞,和用户表的关系,一个用户给点赞多个新闻,一个新闻可以被多个用户点赞。

手动创建第三张表的时候:

新闻表:

1 class Title(models.Model):
2     '''
3     功能:该函数主要是存储标题以及标题文章的url地址和归属板块。
4     '''
5     title=models.CharField(max_length=200)
6     url=models.CharField(max_length=200)
7     user=models.ForeignKey('User')
8     area=models.CharField(max_length=32)#板块。
9     date=models.CharField(max_length=100,default=time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime(time.time())))

用户表:

1 class User(models.Model):
2     '''
3     功能:该表主要是存储用户的账号和密码。
4     '''
5     user=models.CharField(max_length=32)
6     pwd=models.CharField(max_length=32)

第三张点赞表,存储的是新闻表和用户表的ID

1 class Good(models.Model):
2     '''
3     功能:该类是用户的点赞信息表。
4     '''
5     # good_count=models.IntegerField()
6     user=models.ForeignKey('User')
7     title=models.ForeignKey('Title')

如果我们不创建第三张表的话,如下:

class User(models.Model):
    '''
    功能:该表主要是存储用户的账号和密码。
    '''
    user=models.CharField(max_length=32)
    pwd=models.CharField(max_length=32)

class Title(models.Model):
    '''
    功能:该函数主要是存储标题以及标题文章的url地址和归属板块。
    '''
    title=models.CharField(max_length=200)
    url=models.CharField(max_length=200)
    user=models.ForeignKey('User')
    area=models.CharField(max_length=32)#板块。
    date=models.CharField(max_length=100,default=time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime(time.time())))
    good=models.ManyToManyField(User)

语法是ManyToMany。

默认第三表的名字是:Title_User.

c:一对一:比如说:一个系统中含有,管理员用户、超级管理员用户。每当一个用户选择自己用户类型,当选择管理员用户的时候,管理员类型的用户就不存在。即管理员用户只有一个用户,一个用户对应一个管理员用户。也就是说

目前数据库中只有2种类型的用户类型,当用户类型使用完之后,在插入数据的话,需要创建用户类型。相当于该列加唯一性索引和外键。

语法用:OnetoOne  在实际数据库中,并不存在一对一的结构。

1 class  User(models.Model):
2     username=models.CharField(max_length=32)
3     pwd=models.CharField(max_length=32)
4 
5 class   User_type(models.Model):
6     user_type=models.OneToOneField('User')
7     nid=models.AutoField(primary_key=True)
8     phone_num=models.IntegerField()
9     phone_num_1=models.IntegerField()
原文地址:https://www.cnblogs.com/evilliu/p/5917006.html