Django(五)、ORM基础

前言
在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路径,登录查看表结构:
这里写图片描述
这里写图片描述

四、增删改查
在前端写几个简单的增删改查的表格,往后端提交数据,后端在同级目录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的基本操作.

猜你喜欢

转载自blog.csdn.net/ywq935/article/details/79167888