app
里面的models.py
,并且要继承django.db.models.Model
类,示例如下:字段名=models.字段类型(属性=XX)
from django.db import models
class MyModel(models.Model):
name = models.CharFild(max_length=10)
python manage.py makemigrations
python manage.py migrate
save
的方法,如果使用save
方法,该对象会被保存到数据库中的对应表格内或者更新delete
方法可以删除对应的数据object
字段可以用于进行数据库的查询from appname.models import MyModel
# 准备阶段
save_test = MyModel()
save_test.name = '保存测试'
delete_test = MyModel()
delete_test.name = '删除测试'
# 添加
save_test.save()
delete_test.save()
# 查询
search_result = MyModel.object.get(name='删除测试')
# 修改
update_result = MyModel.object.get(name='保存测试')
update_result.name = '更新测试'
update_result.save()
# 删除
delete_result = MyModel.object.get(name='删除测试')
delete_result.delete()
字段名=models.ForeignKey('类名称')
,在使用时可以将外键字段直接用外键对象赋值一对象.外键字段名称
多对象[类名要小写].一对象_set.all()
from django.db import models
class OneForeighKeyTest(models.Model):
name = models.CharFild(max_length=10)
class ManyForeighKeyTest(models.Model):
name = models.CharFild(max_length=10)
one = models.ForeighKey('OneForeighKeyTest')
from appname.models impor OneForeighKeyTest, ManyForeighKeyTest
# 一获取多
one = OneForeighKeyTest.object.get()
many_result = one.manyforeighkeytest_set.all()
# 多获取一
many = ManyForeighKeyTest.object.get()
one_result = many.one
LANGUAGE_CODE='zh-hans'
TIME_ZONE='Asia/Shanghai'
python manage.py createsuperuser
app
下的admin.py
中添加django.contrib.admin.site.register(模型类)
app
下的admin.py
中添加[类名]Admin
类,继承admin.ModelAdmin
,[类名]Admin
类中添加列表字段list_display
,内容为[类名]里的字段名
,并在register方法中添加[类名]Admin
类名作为第二个参数from django.contrib import admin, ModelAdmin
from appname.models import MyModel
class MyModelAdmin(ModelAdmin):
list_display = ['name', ...]
admin.site.register(MyModel, MyModelAdmin)
view.py
文件里,且必须含有参数request
,它是HttpRequest
类型的数据,视图函数需要返回一个HttpResponse
对象。from django.http import HttpResponse
def index(request, [后面可以配合括号捕捉参数]):
return HttpResponse(‘这是首页’)
# 重定向
from django.http import HttpResponseRedirect
from django.shortcut import redirect
def redict_one(request, [后面可以配合括号捕捉参数]):
return HttpResponseRedirect(‘跳转的网页’)
def redict_two(request, [后面可以配合括号捕捉参数]):
return redirect('跳转的网页')
urls.py
文件里添加urlpatterns
列表,里面的值为url('网页url',对应的视图函数[注意,视图函数不要加括号])
或者url('网页url',include(app名称.urls.py))
网页url正则(参数正则)网页url正则
, 视图函数),可以有多个参数,它会依次在传递给视图函数中request
后面的参数from django.urls import path, include
urlpatterns = [
# 可以有多个参数,参数会按照顺序从前往后传递给视图函数requet后面的参数
path('^正则(参数正则)正则$', 视不加括号的图函数),
path('^', include(’别的urls文件‘)),
]
setting.py
的TEMPLATES
的DIRS
键对应的列表中添加文件夹的路径TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [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',
],
},
},
]
django.template.loader.get_template(HTML文件路径)
RequestContext(request, {键值对)
return HttpResponse(模板对象.render(上下文对象))
from django.http import HttpResponse
from django.template import loader, RequestContext
def template_one(request):
model = loader.get_template(HTML文件路径)
context = RequestContext(request, {键值对)
html = model.render(context)
return HttpResponse(html)
from django.shorcut import render
def template_two(request):
return render(request, HTML路径, context={键值对})
context的键
}}{% for i in 列表对应的键 %}
{
{ i[在这里,i代表列表的某个值] }}
{% endfor %}
对应键.字段名
}}对应键.下标
}}或者用循环在setting.py文件中配置如下内容
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
# 使用的数据库要实现建立好,Django不能自动建立数据库
'NAME': '使用的数据库名称',
'USER': '用户名',
'PASSWORD': '密码',
'HOST': 'IP地址',
'PORT': 端口号,
}
}
在__init__.py中导入mysql包
import pymysql
# 如果有版本错误,就把下面一行取消注释
# pymysql.version_info = (1, 4, 13, 'final', 0)
pymysql.install_as_MySQLdb()
字段名称的限制:
字段名 = models.字段类型(属性)
from django.db import models
AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
BooleanField:布尔字段,值为True或False。
NullBooleanField:支持Null、True、False三种值。
CharField(max_length=字符长度):字符串,
参数max_length表示最大字符个数。
TextField:大文本字段,一般超过4000个字符时使用。
IntegerField:整数。
DecimalField(max_digits=None, decimal_places=None):十进制浮点数,
参数max_digits表示总位数,
参数decimal_places表示小数位数。
FloatField:浮点数。
DateField[auto_now=False, auto_now_add=False]):日期。
参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。
参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
TimeField:时间,参数同DateField.
DateTimeField:日期时间,参数同DateField。
FileField:上传文件字段。
ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。
约束
通过选项实现对字段的约束,选项如下:
null:如果为True,表示允许为空,默认值是False。
blank:如果为True,则该字段允许为空白,默认值是False。
对比:null是数据库范畴的概念,blank是表单验证证范畴的。
db_column:字段的名称,如果未指定,则使用属性的名称。
db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。
default:默认值。
primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。
通过模型类.objects
属性可以调用如下函数进行查询:
get 返回满足条件的一条数据,返回的是一个模型类的对象
如果查询到多个数据就会抛出MultipleObjectsReturned
如果没查到则抛出DoesNotExists
all 返回模型类的全部数据,返回类型是JquerySet
filter 返回满足条件的数据,返回类型是JquerySet
exclude 返回不满足条件的数据,返回类型是JquerySet
order_by 排序,返回类型是JquerySet
按照id从小到大排序 order_by('id')
按照id从大到小排序 order_by('-id')
查询的条件
条件格式:模型类属性名__条件名=值
判等条件名 exact
包含 contains
开头以 startwith
结尾以 endwith
空查询 isnull,例如 Book.objects.filter(name__isnull=True)
范围查询 in,例如 Book.objects.filter(name__in=['TCP协议', 'IP协议'])
大于小于等于 gt(greate than)大于 lt(less than)小于 gte 大于等于 lte 小于等于
日期查询 year 年 month 月 day 日 gt 日期大于...
作用: 用于条件多条件查询,每一个Q对象都封装一个条件,Q对象之间用&(与)|(或)~(非)
from django.db.models import Q
# id不等于1或name包含c的数据
Book.objects.filter(~Q(id__exact=1) | name__contins='c')
作用: 用于类属性之间的比较
from django.db.models import F
# id大于等于1或count两倍的数据
Book.objects.filter(Q(id__gte=2*F('count')))
作用: 对查询结果进行聚合操作
sum
count
avg
max
min
agreegate
: 调用这个函数来使用聚合,返回一个字典。
from django.db.models import Count
from appname.models immport Book
# 获取图书的数量
Book.objects.all().agreegate(Count('id'))
exist
方法可以判断查询集是否有数据在这里,我们定义一对应的类叫一类
,多对应的类叫多类
,多类中建立关联的属性叫关联属性
由一类对象查询多类:一类的对象.多类类名小写_set.all()
由多类对象查询一类:多类对象.关联属性
有多类对象查询一类id:多类对象.关联属性_id
通过模型类实现关联查询:
查询生,要求学生关联的班级名称包含'信科'1班:
Student.objects.filter(class__name__contains='信科1班')
插入、更新模型对象用save()
方法,删除模型对象用delete()
方法
自关联是特殊的一对多,格式为 ForeignKey('self', null=True, blank=True)
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=10)
object = models.Manager() # object是用来替换objects的对象,值为Manager或Manager的子类对象
models.Manager
有一个叫做model
的方法,返回models.Manager
所在类的类名在模型类中添加内部类Mate
from django.db import models
class MyClass(models.Model):
title = CharField(max_length=10)
class Meta:
db_name = [指定table name]
request
参数必须有,是一个HttpRequest对象,参数名可以改,但是不建议改。url
,建立视图函数和url
之间的映射关系,通常在urls.py
文件中通过urlpatterns
列表建立映射。from django.urls import path, include
from user import views
urlpatterns = [
path('^正则$', '视图函数'),
path('^正则(正则参数1)正则(正则参数2)正则$', '视图函数'),
path('^正则', include('urls文件')),
path('^正则/', include('urls文件')),
path('^正则/$', include('urls文件')),
]
自定义的404页面
页面{
{ request_path }}找不到!
500.html
文件在templates
下.进行url匹配的时候,可以把要的参数写成一个正则表达式组,django会自动捕捉参数传递给视图函数。
/goods_book/001.html,要求匹配type book以及id 001
urlpatterns = [
url('^book_(\w+)/(\d+).html', 'index')
]
def index(request, type, id):
return HttpResopnse('XXX')
?P<变量名>正则
/goods_book/001.html,要求匹配type book以及id 001
urlpatterns = [
url('^book_(?P\w+)/(\d+).html', 'index')
]
def index(request, type, id):
return HttpResopnse('XXX')
request
是HttpRequest
对象,包含了请求的信息.
def index(request):
request.GET.get('username', '默认值') # 如果没指定默认值,默认值为None;如果键值对不存在,则返回默认值.
try:
request.GET['password']
exccept KeyError as e: # 如果键值对不存在则抛出KeyError
print(e)
ajax请求的格式
$.ajax({
'url': 请求的url地址,
'type': 请求的方式, // POST/GET
'dataType': 预期返回数据的格式,
'data': 参数,
'success': (function(data){
// 请求成功的回调函数,data是返回的数据
})
})
setting.py
中配置静态文件的地址STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]