Django学习【第5篇】:Django 之ORM数据库操作

  django之ORM数据库操作

一. ORM介绍

映射关系:

  表名 -----------------》  类名

  字段    -----------------》 属性

  表记录  ----------------》 类实力化对象

 

ORM的两大功能:

  操作表:

    -创建表

    -修改表

    -删除表

  操作数据行:

    -增删改查

ORM 利用 pymysql 第三方工具链接数据库

Django 没办法帮我们创建数据库,只有我们创建完告诉它,让django去链接。

二. 创建表之前的准备工作

1.手动创建数据库

2.在settings.py里面配置mysql数据库链接

# 修改django默认的数据库的sqlite3为mysql
DATABASES = {
    'default': {
            'ENGINE': 'django.db.backends.mysql', #通过这个去链接mysql
            'NAME': 'djangotsgl',
            'USER':'root',
            'PASSWORD':'123456',
            'HOST':'localhost',
            'PORT':'3306',
        }
    }       

这样写上以后django会默认的去链接数据库,这是会报错,解决的办法是去app中的__init__文件配置

3.app01中的__init__文件

import pymysql
pymysql.install_as_MySQLdb()

4.创建数据库表

models.py

class Book(models.Model):  #必须要继承的
    nid = models.AutoField(primary_key=True)  #自增id(可以不写,默认会有自增id)
    title = models.CharField(max_length=32)
    publishDdata = models.DateField()  #出版日期
    author = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5,decimal_places=2)  #一共5位,保留两位小数

执行命令创建:

python manage.py makemigrations  创建脚本
python manage.py migrate 迁移

具体实际的例子:

models.py

urls.py

views.py

template/publisher_list.html

 5.查看数据库的sql语句(加在settings.py)

查看数据库执行代码
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

 

补充细节知识点:(ORM查询相关)

一. 多对多的正反向查询

class Class(models.Model):
    name = models.CharField(max_length=32,verbose_name="班级名")
    course = models.CharField(verbose_name="课程",max_length=32)
    def __str__(self):
        return self.name

class Teacher(models.Model):
    name = models.CharField(max_length=23,verbose_name="姓名")
    classes = models.ManyToManyField(verbose_name="所属班级",to="Class")
    def __str__(self):
        return self.name

题目1.查找肖锋老师所带的班级

     # 方式一:基于对象的查找
        obj = models.Teacher.objects.filter(name="肖锋").first()
        print(obj.classes.all())
        print("肖锋老师带的班级",obj.classes.values("name"))
        # 方式二:基于双下划线的查找
        obj_cls = models.Teacher.objects.filter(name="肖锋").values("classes__name")
        print("肖锋老师带的班级",obj_cls)

注意点:要说明的是多对多的查询用.all,, 查单个的时候用.values或者values_list,不要用obj.classes.name,,这样查到的会是None,反向查询也是如此,

总结: 不管是一对多,还是多对多,要是查询多的那一方就得用all()

 

待续...

 

posted @ 2018-09-10 20:12  pupilheart  阅读(216)  评论(0)    收藏  举报
小强带你挣小钱v:zln88896

公告

点击 更新中