Django基础操作

Django基本配置

创建Django项目
django-admin startproject djangoRestful
服务器的启动
python manage.py runserver 
创建后台用户
python manage.py createsuperuser
新建App
python manage.py startapp AppName
# 然后将创建的项目注册到Django项目中, 打开基础项目项目的setting.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'AppName'
]
配置模板文件
# 新建一个文件夹templates, 然后进入setting.py文件中, 找到TEMPLATES, 加入下面的
'DIRS': [
            os.path.join(BASE_DIR, 'templates')
        ],
配置MySQL数据库
# setting.py文件中
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
        },
    }
}
部署静态文件
# Django根目录新建文件夹 static, 然后进入setting.py 最后面加入
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
# 模板文件中引用
{% load static %}
<link rel="stylesheet" href="{% static 'css/index.css' %}">
根据数据库生成对应Model
# 要取数据,那model肯定得和数据库的一致,一个快捷的方式可以把数据库中的表生成对应的model
python manage.py inspectdb
# 然后将我们表的model拷贝到models.py中

模型使用

模型的定义

nullblank 的区别:

blank在数据库中存储的是一个空字符串

null在数据库中存储是NULL,而不是一个真正意义上的空字符串

日期类型(DateField、TimeField、DateTimeField)和数字类型(IntegerField、DecimalField、FloatField)不能接受空字符串,如果这两种类型的字段要设置为可空,则需要同时设置null=True,blank=True

from django.db import models

# Create your models here.
sex_choice = (
    (1, '男'),
    (2, '女'),
    (3, '保密')
) # 元组类型
class Student(models.Model):
    # AutoField 自增字段
    # paimary_key 设置为组件
    # null 是否为空
    # unique 字段唯一
    # name 字段名, 默认是前面的变量名
    # verbose_name  admin显示的名称
    # db_index 是否是索引
    # choice 模拟枚举类型
    # auto_now_add 当数据添加时候更新, 后面保持不变
    # auto_now 当数据添加或者更新的时候, 自动更新当前字段
    id = models.AutoField(primary_key=True)
    s_num = models.IntegerField(null=False, unique=True, name='studentNo', verbose_name='学生学号')
    name = models.CharField(max_length=16, null=False, db_index=True)
    sex = models.CharField(max_length=10, choices=sex_choice, default=3)
    description = models.TextField()
    createAt = models.DateTimeField(auto_now_add=True)
    updateAt = models.DateTimeField(auto_now=True)
    
    # 打印student时候, 指定内容
	def __str__(self):
       return self.name + '---' + self.sex
	
    class Meta(object):
        db_table = 'students'  # 修改表名, 原名是appname_student
        verbose_name = '学生表'  # admin显示的表名
        verbose_name_plural = verbose_name #定义复数时的名称 (去除复数的s)
        ordering = ['-id']  # 排序(正序), 倒序:'-id', 随机:'?id'

模型添加字段
age = models.IntegerField() # 是没有给默认值的
# 然后执行命令 python manage.py makemigrations
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: 1 # 选1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>> 20 # 这个20是给的默认值
#最后执行 python manage.py migrate

phone = models.CharField(max_length=11, null=True) # 给了默认值
# 然后执行命令 python manage.py makemigrations
#最后执行 python manage.py migrate
模型的使用
数据添加
 # 模型的定义     s_num = models.IntegerField(null=False, unique=True, name='studentNo', verbose_name='学生学号')
    # 所以这里是studentNo 而不是 s_num
    # 第一种方式
    student = Student.objects.create(studentNo=1704210801, name='张三', sex='女', description='这是张三的一段描述')
    
    # 第二种方式
    student = Student()
    student.studentNo = 1704210802
    student.name = '李四',
    student.sex = '男',
    student.description = '这是李四的一段描述'
    student.save()
数据的查询
# 获取所有的数据
students = Student.objects.all()

# 获取指定条件的数据
students = Student.objects.filter(sex='男', name='张三')
students = Student.objects.filter(sex='男').filter(name='张三')

# 数据表内两个属性对比, 使用F方法, 找出男性数量大于女性数量的公司
class Company(models.Model):
    name = models.CharField(max_length=50, null=False)
    male_num = models.IntegerField()
    female_num = models.IntegerField()

company = Company.objects.filter(male_num__gt=F('female_num'))
数据的更新
Company.objects.filter(id=2).update(name='company2')
数据的删除
Company.objects.filter(id=4).delete()
聚合函数使用
result = Student.objects.aggregate(Avg('age'))
result = Student.objects.aggregate(Sum('age'))
result = Student.objects.aggregate(Max('age'))
result = Student.objects.aggregate(Min('age'))
print(result) # {'age__avg': 23.0}

路由使用

配置app路由文件
  1. 创建一个app过后, 在app目录下创建一个urls.py文件

    # Api/urls.py
    from django.urls import path
    from Api import views
    
    urlpatterns = [
        path('articles', views.findAllArticle)
    ]
    
  2. 全局配置

    # djangoRestful/urls.py
    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        # 把app路由配置进来
        path('api/', include('Api.urls'))
    ]
    
    

模板使用

模板中超链接url
# 第一种: 没有namespace 当前app里面的urls.py
url('result', views.result, name='resultName')
# 模板文件超链接 url
<a href="{% url 'resultName' %}">Result</a>

# 第二种: 有namespace 当前app里面的urls.py
app_name = 'second' # 再加上这一句
# 然后在主路由上面加上namespace
url('app/', include('App.urls', namespace='second'))
# 模板文件超链接 url
<a href="{% url 'second:resultName' %}">Result</a>

会话技术

Cookie使用
def login(request):
    method = request.method
    if method == 'GET':
        return render(request, 'login.html')
    elif method == 'POST':
        res = redirect('second:mine')
        name = request.POST.get('name')
        # res.set_cookie('name', name, max_age=10)
        # Set-Cookie: name=chenjiang; expires=Wed, 26 Feb 2020 09:07:01 GMT; Max-Age=10; Path=/
        res.set_signed_cookie('name', name, salt='salt')
        request.session['status'] = True
        # Set-Cookie: name=chenjiang:1j6sf6:9ySvf2E31FofxlDlY_aVrei_K_U; Path=/
        return res
    
def mine(request):
    # res = request.COOKIES.get('name')
    try:
        res = request.get_signed_cookie('name', salt='salt')
        if res:
            return render(request, 'index.html', {'name': res})
    except Exception as e:
        print('获取失败')
    return redirect('second:login')

def logout(request):
    res = redirect('second:login')
    res.delete_cookie('name')
    return res
Session使用
  1. Django默认会把Session持久化到数据库中

  2. DjangoSession的默认过期时间是14天

  3. 数据安全处理

    • 使用base64
    • 在前部加入一个混淆字符串

def login(request):
    method = request.method
    if method == 'GET':
        return render(request, 'login.html')
    elif method == 'POST':
        res = redirect('second:mine')
        name = request.POST.get('name')
        request.session['name'] = name
        return res

def mine(request):
    try:
        name = request.session.get('name')
        if name:
            return render(request, 'index.html', {'name': name})
    except Exception as e:
        print('获取失败')
    return redirect('second:login')

def logout(request):
    res = redirect('second:login')
    # 下面两行可以清除session和cookie 但是数据库中的数据就会变成垃圾数据
    # del request.session['name']
    # res.delete_cookie('name')
    
    # session cookie一起清除, 包括数据库中的数据
    request.session.flush()
    return res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django中进行数据库操作需要进行以下几个步骤: 1. 在settings.py文件中配置数据库连接信息。可以使用sqlite3或者MySQL等不同的数据库引擎。例如,如果要连接MySQL数据库,需要将DATABASES中的ENGINE设置为'django.db.backends.mysql',并指定HOST、PORT、NAME、USER和PASSWORD等相关参数。 2. 在views.py文件中编写对数据库的操作代码。可以使用Django的ORM(对象关系映射)来进行数据库操作。例如,可以使用models.UserInfo.objects.create()创建一个新的数据库对象,并指定相应的属性值。 3. 在视图函数中处理用户的请求,根据请求的方法(GET或POST)执行相应的数据库操作。例如,可以在POST请求中通过request.POST获取用户提交的表单数据,并使用models.UserInfo.objects.create()将数据写入数据库。 4. 在模板中展示数据库中的数据。可以通过查询数据库获取相应的数据,并将其传递给模板进行展示。例如,可以使用models.UserInfo.objects.all()获取所有的数据库对象,并将其传递给模板进行渲染。 需要注意的是,在进行数据库操作之前,需要确保数据库已经创建并正确配置了相关的权限和表结构。可以在settings.py文件中的DATABASES配置中指定数据库名称、用户名和密码等信息。 总结起来,进行Django数据库操作的主要步骤包括配置数据库连接信息、编写数据库操作代码、处理用户请求以及在模板中展示数据。123 #### 引用[.reference_title] - *1* [Django数据库操作](https://blog.csdn.net/m0_65883616/article/details/125736469)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* *3* [django基础之数据库操作](https://blog.csdn.net/inexaustible/article/details/107981925)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值