Django之ORM模型建议收藏

ORM介绍对象关系映射(ObjectRelationalMapping,简称ORM)模式的作用是在关系型数据库与业务实体对象之间进行映射,这使得我们不需要再去和复杂的SQL语句打交道,只需要简单

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

ORM介绍

  Django之ORM模型建议收藏

  对象关系映射(Object Relational Mapping,简称ORM)模式的作用是在关系型数据库与业务实体对象之间进行映射,这使得我们不需要再去和复杂的SQL语句打交道,只需要简单的操作对象的属性和方法。ORM通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。

  ORM的优势体现在以下三个方面:

  1. 可移植性强,在Django中只需要在settings.py文件中修改新数据库的配置,然后进行迁移数据的操作即可完成数据库的移植,二部需要对ORM进行任何修改

  2. 查询语法简单,让软件开发人员专注于业务逻辑的处理,提高了开发效率

ORM在Django中的应用

字段

Django之ORM模型建议收藏
Django之ORM模型建议收藏

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

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

        注:当model中如果没有自增列,则自动会创建一个列名为id的列
        from django.db import models

        class UserInfo(models.Model):
            # 自动创建一个列名为id的且为自增的整数列
            username = models.CharField(max_length=32)

        class Group(models.Model):
            # 自定义自增列
            nid = models.AutoField(primary_key=True)
            name = models.CharField(max_length=32)

    SmallIntegerField(IntegerField):
        - 小整数 -32768 ~ 32767

    PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正小整数 0 ~ 32767
    IntegerField(Field)
        - 整数列(有符号的) -2147483648 ~ 2147483647

    PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
        - 正整数 0 ~ 2147483647

    BigIntegerField(IntegerField):
        - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807

    BooleanField(Field)
        - 布尔值类型

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

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

    TextField(Field)
        - 文本类型

    EmailField(CharField):
        - 字符串类型,Django Admin以及ModelForm中提供验证机制

    IPAddressField(Field)
        - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制

    GenericIPAddressField(Field)
        - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
        - 参数:
            protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
            unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"

    URLField(CharField)
        - 字符串类型,Django Admin以及ModelForm中提供验证 URL

    SlugField(CharField)
        - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)

    CommaSeparatedIntegerField(CharField)
        - 字符串类型,格式必须为逗号分割的数字

    UUIDField(Field)
        - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

    FilePathField(Field)
        - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
        - 参数:
                path,                      文件夹路径
                match=None,                正则匹配
                recursive=False,           递归下面的文件夹
                allow_files=True,          允许文件
                allow_folders=False,       允许文件夹

    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)
        - 二进制类型

字段相关内容

View Code

自定义字段 

class FixedCharField(models.Field):    """    自定义的char类型的字段类    """    def __init__(self, max_length, *args, **kwargs):        self.max_length = max_length        super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)    def db_type(self, connection):        """        限定生成数据库表的字段类型为char,长度为max_length指定的值        """        return 'char(%s)' % self.max_lengthclass Class(models.Model):    id = models.AutoField(primary_key=True)    title = models.CharField(max_length=25)    # 使用自定义的char类型的字段    cname = FixedCharField(max_length=25)
PS: 返回值为字段在数据库中的属性,Django字段默认的值为:    'AutoField': 'integer AUTO_INCREMENT',    'BigAutoField': 'bigint AUTO_INCREMENT',    'BinaryField': 'longblob',    'BooleanField': 'bool',    'CharField': 'varchar(%(max_length)s)',    'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',    'DateField': 'date',    'DateTimeField': 'datetime',    'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',    'DurationField': 'bigint',    'FileField': 'varchar(%(max_length)s)',    'FilePathField': 'varchar(%(max_length)s)',    'FloatField': 'double precision',    'IntegerField': 'integer',    'BigIntegerField': 'bigint',    'IPAddressField': 'char(15)',    'GenericIPAddressField': 'char(39)',    'NullBooleanField': 'bool',    'OneToOneField': 'integer',    'PositiveIntegerField': 'integer UNSIGNED',    'PositiveSmallIntegerField': 'smallint UNSIGNED',    'SlugField': 'varchar(%(max_length)s)',    'SmallIntegerField': 'smallint',    'TextField': 'longtext',    'TimeField': 'time',    'UUIDField': 'char(32)',

mysql操作

1. 环境

  windows/python3.6.0/mysql/MySQLdb,若对mysql操作不熟悉可以查看数据库之MySql

2. 进入root,创建新账户

  mysql -u root -p

  create user “hello”@”local” identifild by “123456789”;

3. 创建djangodb数据库

  create database IF NOT EXISTS ‘djangodb’;

4. 为新用户授权

  grant all privileges on djangodb.* to “hello”@”localhost”;

  flush privileges;

5. 退出root用hello账户登录,查看数据库

  mysql -u hello -p

  mysql show databases;

  Django之ORM模型建议收藏

django操作mysql

1. 创建工程和应用

  django-admin startproject django_mysql

  python manage.py startapp blog

  可以使用tree /f查看django_mysql目录,以下为blog目录结构

  Django之ORM模型建议收藏 

2. 修改setting.py文件中和数据库相关的设置

DATABASES = {
    'default': {'ENGINE':'django.db.backends.mysql',
    'HOST':'127.0.0.1',
    'PORT':'3306',
    'NAME':'djangodb',
    'USER':'hello',
    'PASSWORD':'123456789',       
    }

3. 通过模型设计数据表

  ./blog/model.py

from django.db import models

# Create your models here.
from django.db import models  #特别注意

class userinfo(models.Model):
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=32)
    age=models.IntegerField()

4. 向数据表中添加项

  ./blog/views.py

from django.shortcuts import HttpResponse
from .models import userinfo
# Create your views here.
def db_handle(request):
    #向数据库中添加数据
    #dic = {"username":"bruce","password":"123456","age":23}
    #dic = {"username":"zhanglin","password":"666666","age":18}
    dic = {"username":"lishi","password":"1123", "age":99}
    objects = userinfo.objects.all()
    print (objects)
    isexists = False
    if not objects and not isexists:
        userinfo.objects.create(**dic)
    else:       
        for object in objects:
            print(object)
            if dic["username"] == object.username:
                isexists = True
                #HttpResponse("username is exits\r\t") #该语句为什么没起作用
                break
        if not isexists:
            userinfo.objects.create(**dic)

    #删除数据
    #userinfo.objects.filter(username="bruce").delete()

    #更新数据
    #userinfo.objects.filter(username="lishi").update(age=99)
    #HttpResponse("ok")

    return render(request, "mysql.html", {"tablerow":objects})

  上面的代码中包含了向数据库中添加、删除和更新数据

5. 测试

  打开django服务,数据url

  python manage.py runserver

  http://127.0.0.1:8000/db_handle/

  在mysql中查看数据库

  Django之ORM模型建议收藏

  图中的blog_userinfo就是我们的数据表,命名方式:应用+models.py中的userinfo函数

  Django之ORM模型建议收藏

渲染

  接下来我们将数据库内容通过html显示到网页上

1. 添加templates相关信息

  settings.py文件中设置templates路径

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates'), ],
        'APP_DIRS': False,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

  在django_mysql添加templates目录并添加mysql.html文件

<!DOCTYPE html>
<html lang="zh-cn">
    <head>
        <meta http-equiv="X-UA_compatible" content="IE=Edge">
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>django_mysql info</title>
    </head>
    <body>
        <h1>django_mysql info</h1>
        <div class="container">
            <table border="1" width="300">
                <tr>
                    <th>用户名</th>
                    <th>密码</th>
                    <th>年龄</th>
                </tr>
                {%for row in tablerow%}
                <tr>
                    <td>{{row.username}}</td>
                    <td>{{row.password}}</td>
                    <td>{{row.age}}</td>
                </tr>
                {%endfor%}
            </table>
        </div>
    </body>
</html>

2. 添加urls

  在应用的urls.py文件中添加如下信息

from django.contrib import admin
from django.urls import path

from blog import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'db_handle/', views.db_handle),
]

3. 渲染的代码已经在views.py中添加

return render(request, "mysql.html", {"tablerow":objects})

4. 打开http://127.0.0.1:8000/db_handle/测试
  Django之ORM模型建议收藏

若要查看django更多详细信息,可以参考:
django初探-创建简单的博客系统(一)
django初探-创建简单的博客系统(二)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120181.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 世界性能服务器图片欣赏,AMD发布全球最强服务器显卡-AMD,全球最强,服务器显卡,FirePro,S9000,S7000,虚拟机 ——快科技(驱动之家旗下媒体)–科技改变未来…[通俗易懂]

    FireStream虽然死了,但是AMD并没有放弃在高性能计算领域的努力,只不过由FirePro继承了它的遗志。今天,AMD就发布了号称全球最强悍的服务器显卡“FireProS9000”、“FireProS7000”,面向数据中心里的高性能计算、虚拟桌面基础设施(VDI)、工作站图形等领域,都支持微软RemoteFX、VMwareESXInfoCenter、CitrixXenServer…

    2022年4月11日
    140
  • 关于我在黑马程序员培训毕业后的亲身体验

    关于我在黑马程序员培训毕业后的亲身体验首先申明:我本人已经于2016年5月份在广州传智播客java培训完毕业,和黑马程序员官网没有任何的利益往来,也没有人出钱给我帮他们做软文推广,这是我在黑马程序员的亲身体验,不存在虚构。

    2022年7月7日
    39
  • 卡方分布、t分布、F分布的期望与方差的计算「建议收藏」

    文章目录卡方分布卡方分布的期望和方差t分布t分布的期望和方差F分布F分布的期望和方差卡方分布设X1,X2,……Xn独立同分布,且服从公共分布N(0,1),则Y=X12+X22+……Xn2服从自由度为n的卡方分布.设X_1,X_2,……X_n独立同分布,且服从公共分布N(0,1),则Y=X_1^2+X_2^2+……X_n^2服从自由度为n的卡方分布.设X1​,X2​,……Xn​独立同分布,且服从公共分布N(0,1),则Y=X12​+X22​+……Xn2​服从自由度为n的卡方分布.卡方分布的期望和方

    2022年4月8日
    355
  • php实现工厂模式

    php实现工厂模式

    2021年11月15日
    58
  • ETL的开发过程[通俗易懂]

    ETL的开发过程[通俗易懂]在生产环境中,使用shell脚本完成一次etl操作1.定义一个etl函数,里面传入json行数据,用json.loads加载行数据,并对行数据进行判断,如果没有行数据,或data字段没有在行数据里,就直接返回空的结果,否则就继续往下执行2.接着获取行里的数据,用for循环判断,如果包含某个值,我就将变量赋值取出,装在集合容器里3.设置sparksession会话,并ena…

    2022年5月23日
    37
  • 什么是 反向代理

    什么是 反向代理什么是反向代理一 反向代理的定义理解思路 无代理 gt 正向代理 gt 反向代理 无代理 与有代理区别为 主要表现 过滤不同 映射不同 权限不同 过滤 使用代理 可以对外界或内部的 Internet 地址进行过滤 映射 使用代理 多个用户使用代理访问外界时 只映射为一个 IP 地址 权限 使用代理 外界不能直接访问到内部网 同时限制内部网对外部的访问权限 无代理 无以上特征 正向代理 内部网络用户向外网发送请求 正向代理即通常所说的代理 用于代表内部网络用户向 Intern

    2025年11月19日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号