创建Django步骤、模型常用字段实例、外键和表关系)
创建Django项目步骤
创建新的Django项目和app模块
在项目settings.py
文件中设置新的数据库配置等
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book', # 项目app
]
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',
],
},
},
]
DATABASES = {
'default': {
# 修改数据库引擎
'ENGINE': 'django.db.backends.mysql',
# 数据库名字
'NAME': 'django_db3',
# 用户名
"USER": "root",
# 密码
"PASSWORD": "root",
# 地址
"HOST": '127.0.0.1',
# 端口
"PORT": 3306,
}
}
模型文件创建:book/models.py
from django.db import models
class Article(models.Model):
aid = models.AutoField(primary_key=True)
数据库中创建相同名称的表
生成迁移脚本文件,并映射到数据库文件:
1、模型常用字段实例
关于时区问题修改settings.py文件
# TIME_ZONE = 'UTC' # 格林威治时间,时区
TIME_ZONE = 'Asia/Shanghai' # 改为中国时区
USE_I18N = True
USE_L10N = True
# USE_TZ = True
USE_TZ = False # 修改时区时,需要修改这个参数为False
views.py文件
from django.shortcuts import render,redirect,reverse
from .models import Article
from django.http import HttpResponse
from datetime import datetime # 没有时区的时间
# Django带有时区的时间 UTC时区,需要在settings.py文件中的进行设置
def index(request):
# article = Article(title="python")
# article.save()
# return HttpResponse("shouye")
# articles = Article.objects.all()
# return render(request, "index.html", context={"articles": articles})
article = Article(title="python", age=datetime.now())
article.save()
return HttpResponse("shouye")
模型文件:models.py
from django.db import models
class Article(models.Model):
aid = models.AutoField(primary_key=True)
is_delete = models.BooleanField(null=True) # null 非空
title = models.CharField(max_length=50) # charfield必须给max_length
birthday = models.DateTimeField(null=True, auto_now_add=True) # auto_now_add=True这个时间是带有时区的时间,是第一条数据保存的时间
age = models.DateTimeField(auto_now=True) # auto_now=True是修改数据时候会保存的时间
email = models.EmailField(null=True) # EmailField没有验证的功能,需要在Form表单中才能验证邮箱的格式
url = models.URLField(null=True) # URLField没有验证的功能,需要在Form表单中才能验证url的格式
class User(models.Model):
# 不同类型数据的限制是Django框架中的限制,不是数据库中的限制
uid = models.BigAutoField(primary_key=True)
需要注意的是DateTimeField
中的时区设置和auto_now_add=True、auto_now=True
的区别;EmailField
和URLField
没有验证格式的功能,需要在Form表单中才能验证格式的正确性。
class User(models.Model):
# 不同类型数据的限制是Django框架中的限制,不是数据库中的限制
uid = models.BigAutoField(primary_key=True)
'''null 默认是为False。在使用字符串相关的Field(CharField/TextField)的时候,
官方推荐尽量不要使用这个参数,也就是保持默认值False。
因为Django在处理字符串相关的Field的时候,即使这个Field的null=False,
如果你没有给这个Field传递任何值,那么Django也会使用一个 空的字符串 " "来作为默认值存储进去。
因此如果再使用null=True,Django会产生两种空值的情形(NULL或者空字符串)。'''
name = models.CharField(max_length=20, null=False)
# pwd是Django中的ORM模型名称字段,db_column="password"中的password是数据库层面的名称
pwd = models.CharField(max_length=20, db_column="password", null=True)
# 唯一性unique
telephone= models.CharField(max_length=20, unique=True, null=True)
注意:null 默认是为False。在使用字符串相关的Field(CharField/TextField)的时候,
官方推荐尽量不要使用这个参数,也就是保持默认值False。
因为Django在处理字符串相关的Field的时候,即使这个Field的null=False,
如果你没有给这个Field传递任何值,那么Django也会使用一个 空的字符串 " "(不同于null)来作为默认值存储进去。 因此如果再使用null=True,Django会产生两种空值的情形(NULL或者空字符串)
2、模型中Meta配置
对于一些模型级别的配置。我们可以在模型中定义一个类,叫做Meta。然后在这个类中添加一些类属性来控制模型的作用。比如我们想要在数据库映射的时候使用自己指定的表名,而不是使用模型的名称。那么我们可以在Meta类中添加一个db_table的属性。
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
class Meta:
db_table = 'book_model'
db_table
这个模型映射到数据库中的表名。如果没有指定这个参数,那么在映射的时候将会使用模型名来作为默认的表名。
ordering
设置在提取数据的排序方式。比如想在查找数据的时候根据添加的时间排序。
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
pub_date = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'book_model'
ordering = ['pub_date'] # 正序
ordering = ['-pub_date'] # 倒序
实例如下:
class User(models.Model):
# 不同类型数据的限制是Django框架中的限制,不是数据库中的限制
uid = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=20, null=False)
# pwd是Django中的ORM模型名称字段,db_column="password"中的password是数据库层面的名称
pwd = models.CharField(max_length=20, db_column="password", null=True)
age = models.IntegerField(default=0, null=True)
telephone = models.CharField(max_length=20, unique=True, null=True)
def __str__(self):
return "User中的排序:uid%s , username:%s" % (self.uid, self.username)
# 类中添加一些类属性
class Meta:
db_table = 'user' # 数据库映射时,使用指定的表名user
# 正序
# ordering = ['uid']
# 倒序
# ordering = ['-uid']
ordering = ['-uid', 'age'] # 先按照uid倒序排,再按照age正序排
3、外键和表关系
在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常的强大。因此这里我们首先来介绍下外键在Django中的使用。
设置默认引擎:
类定义为class ForeignKey(to,on_delete,**options)
。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有CASCADE、SET_NULL
等。这里以一个实际案例来说明。比如有一个Category和一个Article两个模型。一个Category可以有多个文章,一个Article只能有一个Category,并且通过外键进行引用。
class Category(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
# author = models.ForeignKey("User",on_delete=models.CASCADE)
category = models.ForeignKey("Category",on_delete=models.CASCADE)
article/views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Category, Article
def news(request):
# 添加数据
# category = Category(name="python") # 必须用指定参数name=
# category.save()
# article = Article(title="python入门", content="xxx")
# # 外键 相当于article.category_id = category
# article.category = category
# article.save()
# return HttpResponse("新闻页")
# 查询数据 第一种方法
article = Article.objects.get(pk=1)
print(article.category_id) # category_id是外键自动创建的
category = Category.objects.get(pk=article.category_id)
print(category.name) # python
# 另一种直接的写法,外键找到分类的模型,再查找模型中的属性
print(article.category.name) # python
return HttpResponse("新闻页")
注意:添加settings.py中的INSTALLED_APPS
项目app名称;还有项目中的urls.py文件绑定路由。
from django.contrib import admin
from django.urls import path
from book import views
from article import views as n # 防止重名引用
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index),
path('new/', n.news),
]
本文地址:https://blog.csdn.net/weixin_42118531/article/details/107034540