Django的ORM的使用

Django的ORM的使用

在配置好setting.py文件中的数据库配置,跟INSTALLED_APPS中注册好应用

DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'db_demo' # 注册应用,否则ORM的无法正常映射
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'db_demo.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        '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',
            ],
        },
    },
]

WSGI_APPLICATION = 'db_demo.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases

# 数据配置文件
DATABASES = {
    'default': {
        # 数据库的模板引擎,
        'ENGINE': 'django.db.backends.mysql',
        # 数据库的名称
        'NAME': 'book_manage',
        # 连接数据库的用户名称
        'USER':'root',
        # 用户的密码
        'PASSWORD':'123456',
        # IP地址
        'HOST':'127.0.0.1',
        # 端口号
        'PORT':'3306'
    }
}


# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/
# 语言,默认是英文,可以改成中文
LANGUAGE_CODE = 'zh-hans'
# 时区也可以修改
TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/

STATIC_URL = '/static/'
在项目的models.py文件中,新建类,并且继承Django的models.Model
from django.db import models

# Create your models here.

# 创建一个类,必须继Django的models.Model
class Book(models.Model):
    # 使用model中的field的方法,来创建一张表

    # 字段名ID,自动增长,并且为主键,注意,一个模型中如果没有写具体的主键的话,那Django的model会自动创建一个字段名为ID的自动增长的主键
    id = models.AutoField(primary_key=True)
    # 字段名为name.最长长度为100
    name = models.CharField(max_length=100,null=False)
    # 字段名为author,最长长度为100
    author = models.CharField(max_length=100,null=False)
    # 字段名为price,类型为Float,不能为空,默认为0
    price = models.CharField(null=False,default=0)
然后在控制台中使用python manage.py makemigrations命令生成脚本迁移文件,记得需要将应用在项目注册,否则Django检测不到
(venv) H:\pythonProject\db_demo>python manage.py makemigrations
Migrations for 'mysql_demo':
  mysql_demo\migrations\0001_initial.py
    - Create model Book

(venv) H:\pythonProject\db_demo>

然后在控制台中输入 python manage.py migrate执行生成的脚本迁移文件
(venv) H:\pythonProject\db_demo>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, mysql_demo, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying mysql_demo.0001_initial... OK
  Applying sessions.0001_initial... OK

生成之后,可以在数据中看到对应的表就生成了,需要注意的是,如果没有指定表名的话,默认的情况下是会是应用名_类名 比如上述中的代码生成的表名就是 mysql_demo_book

在这里插入图片描述

使用ORM对表进行增加操作,使用创建对象的方式操作模型,然后使用save即可
# 新增操作
def add_book(request):
    book = Book(name='西游记',author='吴承恩',price=300)
    book.save()
    return HttpResponse("新增成功")
查询操作
# 查询操作
def get_book(request):
    # PK就是primary key 主键的意思,无论该表中的主键是什么字段名,使用PK,都代表通过主键查询
    # book = Book.objects.get(pk=1)
    # 还有一种filter的方法,返回的是一个列表
    book = Book.objects.filter(name='西游记')
    print(book)
    return HttpResponse("查询成功")

修改操作
# 修改操作
def modify_book(request):
    book = Book.objects.get(pk=1)
    book.price = 400
    book.save()
    return HttpResponse("修改成功")
删除操作
# 删除操作
def delete_book(request):
    book = Book.objects.get(pk=1)
    book.delete()
    return HttpResponse("删除成功")

关键外键的使用,在Model中使用Django中的models.ForeignKey方法来进行外键的关联
# models.py
from django.db import models

# Create your models here.

# 创建一个类,必须继Django的models.Model
class Book(models.Model):
    # 使用model中的field的方法,来创建一张表

    # 字段名ID,自动增长,并且为主键,注意,一个模型中如果没有写具体的主键的话,那Django的model会自动创建一个字段名为ID的自动增长的主键
    id = models.AutoField(primary_key=True)
    # 字段名为name.最长长度为100
    name = models.CharField(max_length=100,null=False)
    # 字段名为author,最长长度为100
    author = models.CharField(max_length=100,null=False)
    # 字段名为price,类型为Float,不能为空,默认为0
    price = models.FloatField(null=False,default=0)

    def __str__(self):
        return '书名:{name},作者:{author},价格:{price}'.format(name=self.name,author=self.author,price=self.price)



# ORM中外键的使用
class Article(models.Model):
    name = models.CharField(max_length=100)
    content = models.TextField()
    # 使用foreignKey来创建外键关联,第一个参数为关联的表,on_delete指的是当外键表删除时,该数据的操作,CASCADE代表的是级联操作,也就是同时会删除该记录
    book_id = models.ForeignKey('Book',on_delete=models.CASCADE)

创建好之后,需要运行python manage.py makemigrations创建数据库的迁移脚本,然后再执行python manage.py migrate 执行脚本文件,然后在视图函数中,去插入数据

def add_article(request):
	# 也可以同时新增一个book的数据,然后直接绑定在article的外键名称中
	# book = Book(name='111',author='2222',price=500)
	# book.save()
    article = Article(name='秋天来了',content='秋天的第一杯奶茶')
    
    book = Book.objects.get(pk=2)
    # 使用这种方式直接指定外键表的数据即可
    article.book_id = book
    # article.book_id = Book
    article.save()
    return HttpResponse("新增成功")


查询外键表的数据.也变的非常简单,直接使用.语法去获取即可
def get_article(request):
    article = Article.objects.first()
    # atricle.book_id 指向的就是之前关联好外键的表中的数据,可以直接通过对象的方式获取表中的所有数据
    print(article.book_id.name)
    return HttpResponse("查询成功")

ORM中的多对一的表,在model中创建一个Types的模型,作为其他多个模型的外键,然后同样的执行上面的命令,在数据库中生成表
from django.db import models

# Create your models here.


# 创建一个类,必须继Django的models.Model
class Book(models.Model):
    # 使用model中的field的方法,来创建一张表

    # 字段名ID,自动增长,并且为主键,注意,一个模型中如果没有写具体的主键的话,那Django的model会自动创建一个字段名为ID的自动增长的主键
    id = models.AutoField(primary_key=True)
    # 字段名为name.最长长度为100
    name = models.CharField(max_length=100,null=False)
    # 字段名为author,最长长度为100
    author = models.CharField(max_length=100,null=False)
    # 字段名为price,类型为Float,不能为空,默认为0
    price = models.FloatField(null=False,default=0)

    type = models.ForeignKey('Types',on_delete=models.CASCADE,null=True)

    def __str__(self):
        return '书名:{name},作者:{author},价格:{price}'.format(name=self.name,author=self.author,price=self.price)



# ORM中外键的使用
class Article(models.Model):
    name = models.CharField(max_length=100)
    content = models.TextField()
    # 使用foreignKey来创建外键关联,第一个参数为关联的表,on_delete指的是当外键表删除时,该数据的操作,CASCADE代表的是级联操作,也就是同时会删除该记录
    book_id = models.ForeignKey('Book',on_delete=models.CASCADE)
    # 注意这个位置只所以要把null赋值为True,因为Types这个表是后面才加入的,之前的数据中没有这个外键,所以需要允许为空,否则会报错
    type = models.ForeignKey('Types',on_delete=models.CASCADE,null=True)
    
    
# 一对多与多对一
class Types(models.Model):
    name = models.CharField(max_length=100)

然后使用视图函数来去创建Types的表,并且新建book跟article将他们外键绑定,这样Types就是一对多了,添加好了之后,记得在urls.py中完成映射才能访问
from django.db import connection
from django.http import HttpResponse
from django.shortcuts import render
from .models import Book,Article,Types

# Create your views here.

# 新增操作
def add_book(request):
    book = Book(name='西游记',author='吴承恩',price=300)
    type = Types.objects.first()
    book.type = type
    book.save()
    return HttpResponse("新增成功")

def add_article(request):
    article = Article(name='秋天来了',content='秋天的第一杯奶茶')
    book = Book.objects.get(pk=2)
    article.book_id = book
    type = Types.objects.first()
    article.type = type
    # article.book_id = Book
    article.save()
    return HttpResponse("新增成功")


def add_types(request):
    type = Types(name='秋天专栏')
    type.save()
    return HttpResponse("新增类型成功")

一对多的表,如果想要获取某个外键关联下的所有数据,可以通过ORM外键自动添加的 模型名称小写_set.all()来获取,可以看示例代码,(这里需要注意,在pychart首次去写该属性时,没有提示,但是可以正常使用)

def get_type_all(request):
    type = Types.objects.first()
    # article_set这个属性在models中是没有定义的,是Django发现该模型被另外的模型通过外键关联之后自动添加的,Article是模型的名称,所以它的属性是article_set,    Book是模型名称,那属性就是book_set 这个默认的规则
    type.article_set.all()
    type.book_set.all()
    return HttpResponse("查询成功")

数据,可以通过ORM外键自动添加的 模型名称小写_set.all()来获取,可以看示例代码,(这里需要注意,在pychart首次去写该属性时,没有提示,但是可以正常使用)


def get_type_all(request):
    type = Types.objects.first()
    # article_set这个属性在models中是没有定义的,是Django发现该模型被另外的模型通过外键关联之后自动添加的,Article是模型的名称,所以它的属性是article_set,    Book是模型名称,那属性就是book_set 这个默认的规则
    type.article_set.all()
    type.book_set.all()
    return HttpResponse("查询成功")
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值