Django ORM(单表)


前言

之前一直是用Test做项目,容易引起误导,今天我们重开一个项目


一、准备工作

还是之前的test文件夹,执行命令django-admin startproject backend,会在test的同级目录生成一个backend目录,内容跟test基本一致,

1.更新settings.py内INSTALLED_APPS内容

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'backend', # add backend to INSTALLED_APPS
]

2.更新settings.py里面DATABASE的配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'backend',
        'USER': 'python',
        'PASSWORD': 'ycZKd88p6ByWtL8d',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

3.在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置

import pymysql
pymysql.install_as_MySQLdb()

4.生成并配置一个文章库

创建一个app来使用模型,执行命令django-admin startapp fa,在settings.py里面注册这个app

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'backend', # add app to INSTALLED_APPS
    'fa',
]

修改fa目录下的models.py

from django.db import models

# Create your models here.
class Article(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=255)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)    
    updated_at = models.DateTimeField(auto_now=True)
    def __str__(self):
        return self.title

依次执行命令

python manage.py migrate
python manage.py makemigrations
python manage.py migrate

这个时候数据库就会多一张fa_article的表了

二、使用步骤

1.增加数据

在fa目录下新增一个urls.py

from django.urls import path,re_path # 导入 path 和 re_path
from . import views # 导入 views 模块

app_name = 'article'  # 这里的 app_name 是用于 URL 命名空间
urlpatterns = [ 
    path('add', views.add, name='add'),
]

更新backend下面的urls.py

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

# 从 django.urls 引入 include
from django.urls import include, re_path, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('article/', include('fa.urls')),  # 包含 TestModel 应用的 URL 配置
]

在backend下新建一个templates目录,更新settings.py的TEMPLATES

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],       # 修改位置(这里需要在头部增加一行 import os,不然会报错)
        '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',
            ],
        },
    },
]

目录下新增一个add.html

<DOCTYPE html>
<html>
<head>
	<title>Create</title>
</head>
<body>
	<h1>Create</h1>
	<form method="POST" action="">
		{% csrf_token %}
		<p>title: <input type="text" name="title"></p>
		<p>content: <textarea name="content"></textarea></p>
		<button type="submit">Create</button>
	</form>
</body>
</html>

更新fa目录下的views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import Article

# Create your views here.
def add(request):
    if request.method == 'POST':
        data = request.POST.dict()
        article_model = Article(title=data['title'], content=data['content'])
        article_model.save()
        return HttpResponse('Article created successfully')
    else:
        return render(request, 'add.html')
        

访问地址http://127.0.0.1:8082/article/add,这里就不截图实现效果了

2.更新数据

templates下新增一个update.html

<DOCTYPE html>
<html>
<head>
	<title>Update</title>
</head>
<body>
	<h1>Update</h1>
	<form method="post" action="">
		{% csrf_token %}
		<p>title: <input type="text" name="title" value="{{ article.title }}"></p>
		<p>content: <textarea name="content">{{ article.content }}</textarea></p>
		<button type="submit">Update</button>
	</form>
</body>
</html>

views.py新增一个update方法

def update(request, id):
	# 这里直接通过链接的参数获取到模型数据
    article_model = Article.objects.get(id=id)
    if request.method == 'POST':
        data = request.POST.dict()
        article_model.title = data['title']
        article_model.content = data['content']
        article_model.save()
        return HttpResponse('Article updated successfully')
    else:
        return render(request, 'update.html', {'article': article_model})

新增urls.py的路由

path('update/<int:id>', views.update, name='update'),# 这里做了参数限定,在链接后面拼数据的id

访问地址http://127.0.0.1:8082/article/update/1

3.查询数据(列表)

templates目录下新增list.html

<DOCTYPE html>
<html>
<head>
	<title>List Page</title>
</head>
<body>
	<h1>List Page</h1>
	<ul>
		{% for item in articles %}
			<li><p>title: {{ item.title }}  content: {{ item.content }}</p></li>
		{% endfor %}
	</ul>
</body>
</html>

views.py增加list方法

def list(request):
    articles = Article.objects.all()
    return render(request, 'list.html', {'articles': articles})

urls.py路由更新

from django.urls import path,re_path # 导入 path 和 re_path
from . import views # 导入 views 模块

app_name = 'article'  # 这里的 app_name 是用于 URL 命名空间
urlpatterns = [ 
    path('add', views.add, name='add'),
    path('update/<int:id>', views.update, name='update'),
    path('list', views.list, name='list'),
]

访问链接http://127.0.0.1:8082/article/list

4.详情数据

templates下增加detail.html

<DOCTYPE html>
<html>
<head>
	<title>Detail Page</title>
</head>
<body>
	<h1>{{ article.title }}</h1>
	<p>{{ article.content }}</p>
</body>
</html>

views.py增加detail方法

def detail(request, id):
    article_model = Article.objects.get(id=id)
    return render(request, 'detail.html', {'article': article_model})

新增urls.py路由

path('detail/<int:id>', views.detail, name='detail'),

访问链接http://127.0.0.1:8082/article/detail/1

5.删除数据

删除不需要页面(实际项目在列表加删除操作即可,这里我们直接走链接)
增加delete方法

def delete(request, id):
    article_model = Article.objects.get(id=id)
    if article_model.delete():
        return HttpResponse('Article deleted successfully')
    else:
        return HttpResponse('Article not found')

路由增加

path('delete/<int:id>', views.delete, name='delete'),

访问链接http://127.0.0.1:8082/article/delete/1

三、一些参数

# 方式一:模型类实例化对象
# 需要先引入模型from .models import Article
#模型保存,在数据库中新增,需要先实例化对象
article_model = Article(title=data['title'], content=data['content'])
article_model.save()
# 方式二:通过 ORM 提供的 objects 提供的方法 create 来实现
article = Article.objects.create(title=data['title'],content=data['content'])

# 使用 all() 方法来查询所有内容
articles = Article.objects.all()

# 查询符合条件的数据
# 主键id
article_model = Article.objects.get(id=id)
article_model = Article.objects.filter(pk=id)
# 字段
article_model = Article.objects.filter(title='title', content='content')

# exclude() 方法用于查询不符合条件的数据
article_model = Article.objects.exclude(pk=5)
article_model = Article.objects.exclude(title='title', content='content')

# get() 方法用于查询符合条件的返回模型类的对象符合条件的对象只能为一个
# 符合条件的对象超过一个或者没有都会抛出错误
article_model = Article.objects.get(pk=5)

# order_by() 方法用于对查询结果进行排序
article_model = Article.objects.order_by("id") # 查询所有,升序排列 
article_model = Article.objects.order_by("-id") # 查询所有,降序排列

# reverse() 方法用于对查询结果进行反转
article_model = Article.objects.order_by("-id").reverse() # 升序排列 - 降序再反转

# count() 方法用于查询数据的数量返回的数据是整数
article_model = Article.objects.count() # 查询所有数据的数量 
article_model = Article.objects.filter(title='test').count() # 查询符合条件数据的数量

# first() 方法返回第一条数据返回的数据是模型类的对象
# 也可以用索引下标 [0]
article_model = Article.objects.first()

# last() 方法返回最后一条数据返回的数据是模型类的对象
# 不能用索引下标 [-1]
article_model = Article.objects.last()

# exists() 方法用于判断查询的结果 QuerySet 列表里是否有数据
# 返回的数据类型是布尔,有为 true,没有为 false
article_model = Article.objects.first().exists()

# values() 方法用于查询部分字段的数据
article_model = Article.objects.values("pk","title")

# values_list() 方法用于查询部分字段的数据
article_model = Article.objects.values_list("title","content")

# distinct() 方法用于对数据进行去重
article_model = Article.objects.values_list("title").distinct()

# filter() 方法基于双下划线的模糊查询
# filter 中运算符号只能使用等于号 = ,不能使用大于号 > ,小于号 < ,等等其他符号,__in 用于读取区间,= 号后面为列表
article_model = Article.objects.filter(id__in=[1,10])

# __gt 大于号 ,= 号后面为数字
# __gte 大于等于,= 号后面为数字
# __lt 小于,=号后面为数字
# __lte 小于等于,= 号后面为数字
# __range 在 ... 之间,左闭右闭区间,= 号后面为两个元素的列表
# __contains 包含,= 号后面为字符串
# __icontains 不区分大小写的包含,= 号后面为字符串
# __startswith 以指定字符开头,= 号后面为字符串
# __endswith 以指定字符结尾,= 号后面为字符串
# __year/__month/__day 是 DateField 数据类型的年月日,= 号后面为数字

# 使用模型类的 对象.delete()
article_model.delete()
# 使用 QuerySet 类型数据.delete()
article_model = Article.objects.filter(pk__in=[1,2]).delete()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值