zoukankan      html  css  js  c++  java
  • django Model模型二及Model模型对数据库的操作

    在django模型中负责与数据库交互的为Model层,Model层提供了一个基于orm的交互框架

    一:创建一个最基本的Model

    from __future__ import unicode_literals
    from django.db import models
    import time
    from Model.usertype import usersType

    class userInfo(models.Model):
    username=models.CharField(max_length=100)
    passwd=models.CharField(max_length=20)
    sex=models.BooleanField()

    以上代码将创建一个最基本的Model模型,userinfo类名称实际性对应的为数据库中表的名称,具体的名称将由django自动生成相应的表名称,如:web_userinfo表名,通常是由app的名称+类名组成表名,所以app一定要注册到工程中才可以生成相应的表名及相关字段
    同时,如果在Model中没有显式指定一个主键,django将生成一个默认的数值型的自增长id主键
    同时在创建model是可以给字段指定默认值
       如:gender=models.BooleanField(default=false)
    将以上model类同步到数据库中生成相应的表后,如果需要对表建立外键时可以做以下设置:
    class userInfo(models.Model):
    username=models.CharField(max_length=100)
    passwd=models.CharField(max_length=20)
    sex=models.BooleanField()
       typeId=models.ForeignKey('usersType')

    class usersType(models.Model):
    username=models.CharField(max_length=50)
    job=models.CharField(max_length=20)
    通过以上设置后即对两个Model中建立外键关系,即从userType到userinfo产生一对多的对应关系

    当需要建立多对多的关系的时候通常有两种做法,一种是基于django特性的,另一种是非基于django特性的,但是两者的本质相同,都是通过中间表来实现最终目的

    非django特性的即在两个Model之后再建立一个Model实体,在另外的两个实体中与其建立外键关系,显式的构建中间表来处理

    基于django特性的即通过
    ManyToManyField来隐式构建中间表处理此类问题

    针对django特性的范例代码如下:
    class Group(models.Model):
    Name=models.CharField(max_length=50)
    class user(models.Model):
    Name=models.CharField(max_length=100)
    email=models.EmailField()
    rel_group=models.ManyToManyField('Group')
    在运行数据库的同步命令后以上代码将在数据中建立三张表,其中一张中间表将自动建立

    更多的字段参数:
    class Args(Models.model):
    name:models.CharField(max_length=20,null=True) 允许为空
     
    class Asset(Models.model):
    createdate=Models.DateTimeField(auto_now_add=true) 创建后django将自动维护该字段数据
    updatetime=Models.DateTimeField(auto_now=True)
     
    auto_now_add=True代表该字段所在行的数据建立时更新该字段
    updatetime=Models.DateTimeField(auto_now=True) 代表数据更新时自动更新

    django中数据库的操作:

    数据库的底层操作借助继承自django框架的已封装至mode层,但是对这些操作的调用通常在view层实现,在mtv框架中view层相当于mvc的controller负责视图与实体之间桥梁工作

    以web的App为例,view层的代码如下:

    Create:
    def add(request,hostname):
    try:
    Asset.objects.create(hostname=hostname)

    return HttpResponse('ok')
    except Exception as err:
    return HttpResponse(err)
    以上代码即实现了对数据库写入一条数据的目的
    由于实体继承自Model,而django的Model对数据的操作封装在了实体的objects下,所以对数据的操作应该是Model类名.objects.操作方法( Asset.objects.create(hostname=hostname))

    在以上方法中,request参数为必选项,代表了当前请求的上下文内容,第二个参数为hostname,代表从url中传递到方法中的参数,即相当于http://127.0.0.1/web/add/hp,hp即对应hostname
    然后需要在urls.py中配置相应的路由映射
    如:url(r'^add/(?P<hostname>w*)/$',add),
    运行访问:http://127.0.0.1:8000/web/add/ibm
    页面返回"ok"没有报错内容时查看数据库是否已经写入内容,如果输出ok时却没有发生异常,数据写入已完成
    Remove:

    def delete(request,id):
    try:

    obj=Asset.objects.get(id=id)
    if obj:
    obj.delete()
    return HttpResponse('操作成功')
    else:
    return HttpResponse('不存在指定id')

    except Exception as err:
    return HttpResponse(err)

    配置相应的url映射如下:
    url(r'^del/(?P<id>d*)/$',delete),

    访问url http://127.0.0.1/web/del/1无异常后查看数据库变化

    Update:

    def update(request,id,name):
    '''
    更新
    :param request:
    :param id:
    :param name:
    :return:
    '''
    try:
    obj=Asset.objects.get(id=id)
    obj.hostname=name
    obj.save()
    return HttpResponse('ok')
    except Exception as err:
    return HttpResponse(err)
    配置Url映射:
    url(r'^update/(?P<id>d*)/(?P<name>w*)/$',update),

    访问http://127.0.0.1/web/update/1/jay后查看数据库内容

    Query:

    def query(request,name):
    Asset.objects.filter(hostname__contains=name)
    return HttpResponse('ok')
    以上为模乎查询相当于sql中的likem

    对于数据的查询还有一种方法就是使用get,在update时已经使用过,如下:
       obj=Asset.objects.get(id=id)
    使用filter与使用get的区别就是使用get时返回音箱数据直接对应实体模型,但昌所查询的数据如果在数据库中不存在是将报借,但是使用filter返回的是django封装的queryset类型的数据

    其它:
    排序:
    
    
     all_data=Asset.objects.all().order_by("-id") //desc
    
    
    all_data=Asset.objects.all().order_by("id") //asc
     
    取前N条记录:
    alldata=Asset.objects.All()[0:2]
     
    查询指定指定字段的值
    data=Asset.objects.all().values("id","hostname",.....)
    
    
     
    原始SQL查询
    django会自动创建连结与释放游标
     
    创建游标:
    cursor=connection.cursor
    cursor.execute("sql语句")
    row=cursor.fetchone()


     
     
     
     
     
    
    
  • 相关阅读:
    Winform Treeview 的按需加载
    Dynamic CRM 2013学习笔记(十)客户端几种查询数据方式比较
    Dynamic CRM 2013学习笔记(九)CrmFetchKit.js介绍:Fetchxml、多表联合查询, 批量更新
    Dynamic CRM 2013学习笔记(八)过滤查找控件 (类似省市联动)
    iOS Programming
    Hello Socket
    解决ARC的循环引用问题
    解决Eclipse下不自动拷贝apk到模拟器问题( The connection to adb is down, and a severe error has occured)
    解决Android NDK 报jxxx编译找不到
    做一个创建cocos2d-x新项目的shell脚本
  • 原文地址:https://www.cnblogs.com/lijintian/p/5840928.html
Copyright © 2011-2022 走看看