Django数据库操作ORM
Django中的ORM,不用写sql语句,自动操作数据库
一、数据库连接
二、model.py新建第一个表
新建第一个表
第一步:models.py中写类、表字段
class Category(models.Model): name = models.CharField(verbose_name='分类名称',max_length=50,unique=True) create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)#null=True可以为空,默认是不可以为空 update_time = models.DateTimeField(verbose_name='修改时间',auto_now=True) class Meta: db_table = 'category'#数据库中表名字,如果不写默认是子项目名称加类名 verbose_name = '文章分类' verbose_name_plural = verbose_name#复数 ordering = ['-create_time']#指定字段排序,默认升序,减号代表降序
def __str__(self):
return self.name #后台返回的名字,字段名称
第二步:执行命令生成表结构makemigrations-->migrate
python manage.py makemigrations #生成表结构(py)
python manage.py makemigrations user #指定子项目生成表结构(py),不会更改其它项目的数据库
python manage.py migrate #同步到数据库
三、django自带后台添加编辑数据
第一步:admin.py中配置
from . import models admin.site.register(models.Category)
第二步执行:
python manage.py createsuperuser #创建后台管理的admin用户
第三步访问:http://127.0.0.1:8000/admin/
用户名密码就是第二步设置的
admin.py设置:
页面就可以进行数据的增删改查
后台管理标题更改
效果:
后台变好看,但是打开时会很慢,所以我是注释掉的
四、django前后端不分离项目
1、views.py里写返回的html页面逻辑
2、将html文件和静态文件拷贝到指定位置并配置好
3、html文件中引用css
4、后端数据在前端展示
前端引用变量
前端循环变量
效果:
models.py
from django.db import models # Create your models here. class BaseModel(models.Model):#基类,公共字段 create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)#null=True可以为空,默认是不可以为空 update_time = models.DateTimeField(verbose_name='修改时间',auto_now=True) class Meta: abstract = True#这个类只是用来继承,不单独创建表,如果不写就会创建表 class Category(BaseModel): name = models.CharField(verbose_name='分类名称',max_length=50,unique=True) class Meta: db_table = 'category'#数据库中表名字 verbose_name = '文章分类' verbose_name_plural = verbose_name ordering = ['-create_time'] def __str__(self): return self.name class Article(BaseModel): title = models.CharField(verbose_name='文章标题',max_length=100,) content = models.TextField(verbose_name='文章内容') #长文本类型 read_count = models.IntegerField(verbose_name='阅读次数',default=0) category = models.ForeignKey(Category,db_constraint=True,on_delete=models.PROTECT,verbose_name='分类')#外键,与分类表中的id关联 #如果删除分类,分类下的文章是够删除,有几种模式: # models.DO_NOTHING #什么也不干 # models.CASCADE ,会删除 # models.SET_DEFAULT ,设置一个默认值,1 # models.SET_NULL #设置成空 # models.PROTECT#受保护的,如果还有在使用的,不能让你删除 # models.SET#自定义模式,自己指定 class Meta: db_table = 'article' verbose_name = '文章' verbose_name_plural = verbose_name ordering = ['-create_time'] def __str__(self): return self.title
转载:
https://www.cnblogs.com/lhy-qingqiu/p/14017222.html
1.models字段类型
AutoField():一个IntegerField,根据可用ID自动递增。如果没指定主键,就创建它自动设置为主键。
IntegerField():一个整数;
FloatField:浮点型
CharField(max_length = 20):字符串字段,字段最大长度为20
DateField(verbose_name='创建时间',auto_now=False, auto_now_add=False):日期;参数auto_now:每次保存对象时,自动设置该字段为当前时间。用于"最后一次修改"的时间戳. 注意,它总是使用当前日期, 默认为False。参数auto_now_add:当对象第一次被创建时自动设置当前时间。用于创建时间的时间戳. 它总是使用当前日期,默认为False;参数auto_now auto_now_add default是互相排斥的,组合会发生错误
TImeFiled():时间,参数同DateField
TextField():一个很长的的文本字段
BooleanField():布尔字段,True或False;
NullBooleanField():值为Null,True,False;
FileField():上传文件字段
ImageField():用于上传图片并验证图片合法性,需定义upload_to参数,使用本字段需安装pip install pillow图片库;设置upload_to 到某个目录下,需要在settings.py中配置多媒体文件路径: MEDIA_ROOT = os.path.join(BASE_DIR,'static'); models.ImageField(upload_to="article_img" )表示会将从static目录下的article_img文件夹上传图片
OneToOneField(to, on_delete, parent_link = False):一对一
ForeignKey(to, on_delete):一对多
ManyToManyField(to):多对多
2.字段参数
null:如果设置为True,当该字段为空时,Django会将数据库中该字段设置为NULL。默认为False 。
blank:如果设置为True,该字段允许为空。默认为False。
default:该字段的默认值。可以是一个值或者是个可调用的对象,如果是个可调用对象,每次实例化模型时都会调用该对象。
primary_key:如果设置为 True ,将该字段设置为该模型的主键。
unique:如果设置为 True,这个字段的值必须在整个表中保持唯一。
verbose_name:任何字段类型都接收一个可选的位置参数,如果未指定Django会自动使用字段的属性名作为该参数值,并且把下划线转换为空格。
max_length:设置默认长度,一般在CharField、TextField、EmailField等文本字段设置
choices:设置该字段的可选值,本字段的值是一个二维元素的元祖;元素的第1个值为实际存储的值,第2个值为HTML页面显示的值
upload_to:设置上传路径,ImageField和FileField字段需要设置此参数,如果路径不存在,会自动创建
db_index:索引,一般常用来做查询的字段设置为索引,设置为True表示设置索引
db_constraint:ForeignKey /ManyToManyField/OneToOneField时有这个字段,为False时表示不受母表约束,母表删除数据时外键不受影响
on_delete:ForeignKey /ManyToManyField/OneToOneField时有这个字段有这个字段,一般值为models.DO_NOTHING时表示母表删除数据时,外键不做任何处理,经常和db_constraint=False连用
3.Meta属性
verbose_name:设置对象名称(例如usecms),若没有设置,则默认为该类名的小写分词形式,例如类名为CamelCase会被转换为camel
verbose_name_plural:设置对象名称复数(例如usercms),一般设置跟verbose_name一样,verbose_name_plural=verbose_name否则会默认加s;
db_table:设置映射的数据表名,默认为“应用名_模型名”,即用该模型所在app的名称加本模型类的名称
ordering :排序规则,按照哪个字段排unique_together序,加上负号是降序 ,ordering = ['id','-create_time']
unique_together :联合主键 unique_together = ('name','id_card')
proxy:设置True or False,设置本模型及所有继承本模型的子模型是否为代理模型;
abstract:设置True or False,设置本模型类是否为抽象基类;如果是抽象基类,那么是不会创建这张表的,这张表用来作为基类被其他的表继承