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

  • 相关阅读:
    浏览器输入一个url到整个页面显示出来经历了哪些过程?
    ajax
    为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?
    jQuery中ready方法的实现
    this+call、apply、bind的区别与使用
    内存泄漏、垃圾回收机制、哪些情况会导致内存泄漏
    浏览器同源策略和跨域方法
    node.js
    JS原型、原型链、构造函数、实例与继承
    JS常用操作节点的方法
  • 原文地址:https://www.cnblogs.com/Mezhou/p/14229047.html
Copyright © 2011-2022 走看看