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,设置本模型类是否为抽象基类;如果是抽象基类,那么是不会创建这张表的,这张表用来作为基类被其他的表继承

原文地址:https://www.cnblogs.com/Mezhou/p/14229047.html