欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Django(五)、ORM基础

程序员文章站 2022-04-16 10:33:04
...

前言
在Python中,最知名的ORM非SQLAlchemy莫属了,同时,Django作为一款功能丰富的框架,其中也内置了专属的ORM,其语法逻辑与SQLAlchemy十分相似,有过SQLAlchemy使用经验的可以很容易上手。SQLAlchemy基础使用参考:Python ORM :SQLAlchemy基础使用

一、常用字段类型


    AutoField(Field)
        - int自增列,必须填入参数 primary_key=True

    BigAutoField(AutoField)
        - bigint自增列,必须填入参数 primary_key=True
        - 
    SmallIntegerField(IntegerField):
        - 小整数 -3276832767

    PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正小整数 032767
    IntegerField(Field)
        - 整数列(有符号的) -21474836482147483647

    PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正整数 02147483647

    BigIntegerField(IntegerField):
        - 长整型(有符号的) -92233720368547758089223372036854775807

    BooleanField(Field)
        - 布尔值类型

    NullBooleanField(Field):
        - 可以为空的布尔值

    CharField(Field)
        - 字符类型
        - 必须提供max_length参数, max_length表示字符长度

    TextField(Field)
        - 文本类型

    FileField(Field)
        - 字符串,路径保存在数据库,文件上传到指定目录
        - 参数:
            upload_to = ""      上传文件的保存路径
            storage = None      存储组件,默认django.core.files.storage.FileSystemStorage

    ImageField(FileField)
        - 字符串,路径保存在数据库,文件上传到指定目录
        - 参数:
            upload_to = ""      上传文件的保存路径
            storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
            width_field=None,   上传图片的高度保存的数据库字段名(字符串)
            height_field=None   上传图片的宽度保存的数据库字段名(字符串)

    DateTimeField(DateField)
        - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

    DateField(DateTimeCheckMixin, Field)
        - 日期格式      YYYY-MM-DD

    TimeField(DateTimeCheckMixin, Field)
        - 时间格式      HH:MM[:ss[.uuuuuu]]

    DurationField(Field)
        - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型

    FloatField(Field)
        - 浮点型

    DecimalField(Field)
        - 10进制小数
        - 参数:
            max_digits,小数总长度
            decimal_places,小数位长度

    BinaryField(Field)
        - 二进制类型

二、常见字段参数


    null                数据库中字段是否可以为空
    db_column           数据库中字段的列名
    db_tablespace
    default             数据库中字段的默认值
    primary_key         数据库中字段是否为主键
    db_index            数据库中字段是否可以建立索引
    unique              数据库中字段是否唯一
    unique_for_date     数据库中字段【日期】部分是否唯一
    unique_for_month    数据库中字段【月】部分是否唯一
    unique_for_year     数据库中字段【年】部分是否唯一
                        注意:当unique 为 True时,你不需要再指定db_index创建索引,因为unique暗示创建索引

    verbose_name        Admin中显示的字段名称
    blank               Admin中是否允许用户输入为空
    editable            Admin中是否可以编辑
    help_text           Admin中该字段的提示信息
   choices              Admin中显示选择框的内容,较少且几乎不变动的数据,可以将其放在程序内存
                        中,不用单独创建一张表从而避免跨表操作
                        如:type = models.IntegerField(choices=[(0, 'man'),(1, 'woman'),],default=1)

三、表结构创建
在django程序子目录或主目录创建models.py文件,在该文件内定义表结构,比如创建一个主机表,创建方式如下:

from django.db import models

# Create your models here.

class Host(models.Model):
    id = models.AutoField(primary_key=True)
    hostname = models.CharField(max_length=16,db_index=True)
    host_ip = models.GenericIPAddressField(db_index=True)
    owner_name=models.CharField(max_length=16)
    owner_id = models.CharField(max_length=16)
    asset_tag=models.CharField(max_length=16)
    online_time=models.DateField(default=None)
    OS = models.CharField(max_length=16)
    OS_type=models.CharField(max_length=16)
    off_time=models.DateField(default=None)
    SN=models.CharField(max_length=32)
    Brand=models.CharField(max_length=8)
    memory=models.SmallIntegerField(default=None)
    CPU_num=models.IntegerField(default=None)

cmd输入:

python manage.py makemigrations   #检测表结构变化
python manage.py migrate                #表结构构建

django默认使用的是自带的sqlite,使用Navicat连接此sqlite路径,登录查看表结构:
Django(五)、ORM基础
Django(五)、ORM基础

四、增删改查
在前端写几个简单的增删改查的表格,往后端提交数据,后端在同级目录views.py中引入model.py对前端请求进行处理:

后端views.py:

from cmdb import models

#增
def addhost(request):
    ref=request.META.get('HTTP_REFERER')  #获取request referer来源url
    print(request.POST)
    if request.method == "POST":
        #方式一:
        #obj=models.Host(hostname='',host_ip='xxx',...)
        #obj.save()

        #方式二:
        #models.Host.objects.create(hostname="xxx",host_ip='xxx',...) #直接加,各字段直接传参,推荐使用


        #方式三:各字段名作key,值作value,构建一个dict,使用models.Host.objects.create(**dict)的方式创建,推荐字段较多时使用。

        obj_info={
           'hostname' : request.POST.get("hostname"),
           'host_ip' : request.POST.get("host_ip"),
           'owner_name' : request.POST.get("owner_name"),
           'owner_id' : request.POST.get("owner_id"),
           'asset_tag' : request.POST.get("asset_tag"),
           'online_time' : request.POST.get("online_time"),
           'OS' : request.POST.get("OS"),
           'OS_type' : request.POST.get("OS_type"),
           'off_time' : request.POST.get("off_time"),
           'SN' : request.POST.get("SN"),
           'brand' : request.POST.get("brand"),
           'memory' : int(request.POST.get("mem")),
           'CPU_num' : int(request.POST.get("CPU_num")),
       }
       models.Host.objects.create(**obj_info)

  return redirect(ref)

#查
def search(request):
    if request.method=="GET":
        Owner=request.GET.get('Owner',None)
        print(Owner)
        sear_res=models.Host.objects.filter(owner_name=Owner)
        print(sear_res)  #查询出来的结果是一个queryset集合的格式,当做list格式理解

        return render(request,'cmdb_index.html',{"search_result":sear_res})

#删
def delete(request):
    ref=request.META.get('HTTP_REFERER')  #获取request referer来源url
    nid=int(request.POST.get('nid'))

    models.Host.objects.filter(id=nid).delete()  #query then delete

    return redirect(ref)


#改
def modify(request):
    res={"status":True,"error":False,"data":None}
    ref=request.META.get('HTTP_REFERER')  #获取request referer来源url

    if request.method=='POST':
        try:
            obj_info={
                'hostname' : request.POST.get("hostname"),
                'host_ip' : request.POST.get("host_ip"),
                'owner_name' : request.POST.get("owner_name"),
                'owner_id' : request.POST.get("owner_id"),
                'asset_tag' : request.POST.get("asset_tag"),
                'online_time' : request.POST.get("online_time"),
                'OS' : request.POST.get("OS"),
                'OS_type' : request.POST.get("OS_type"),
                'off_time' : request.POST.get("off_time"),
                'SN' : request.POST.get("SN"),
                'Brand' : request.POST.get("Brand"),
                'memory' : int(request.POST.get("memory")),
                'CPU_num' : int(request.POST.get("CPU_num")),
            }
            nid=request.POST.get('Asset_ID')
            models.Host.objects.filter(id=int(nid)).update(**obj_info)  #查询然后更新,即修改

        except Exception as e:
            res['error']=e
            res['status']=False

        return HttpResponse(json.dumps(res))

前端代码就不贴了,涉及到一些ajax的操作,后面再整理一下ajax的基本操作.

相关标签: Django ORM