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()