配置
1.创建 urls.py文件 (user应用里)
2.在 主路由配置
path(’’,include(‘user.urls’))
#导包路径 sys.path 必须有个 apps目录 作为查找包的路径
3.settings里
import sys # python解释器系统
sys.path.insert(0,os.path.join(BASR_DIR,‘apps’))
#配置应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user.apps.UserConfig',
]
# 配置数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '密码'
}
}
# 指默认的用户模型 django特有的模型路径
# '应用名.模型名'
# 1.系统路径 文件 文件夹
# 2.python解释器系统导包路径
# 3.django系统的模型路径
AUTH_USER_MODEL = 'user.User'
Django路径问题
文件路径(os.path) windows操作系统的路径
导包路径(sys.path) python解释器系统 查找包的路径
模块路径(user.User) django特有的模型路径
模型路径
外键的顺序调换 会报错
=报错==
1 直接写模型名
class Pinglun(models.Model):
content = models.CharField()
user = models.ForeignKey(User)
class User(AbstractUser):
# 冗余设计
phone = models.CharField(‘手机号’, max_length=24)
class Meta:
db_table = 'tb_user'
=不报错==
2 使用模型路径(应用名.模型名)
class Pinglun(models.Model):
content = models.CharField()
user = models.ForeignKey('user.User')
class User(AbstractUser):
# 冗余设计
phone = models.CharField('手机号', max_length=24)
class Meta:
db_table = 'tb_user'
demo
进入目录: ls syl
进入目录: cd apps
#因为 manage.py 文件 是在 syl目录下
创建应用: python …/manage.py startapp demo
#配置应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user.apps.UserConfig',
'demo_app.apps.DemoAppConfig',
]
from django.db import models
#定义图书模型类BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name=‘名称’)
bpub_date = models.DateField(verbose_name=‘发布日期’)
bread = models.IntegerField(default=0, verbose_name=‘阅读量’)
bcomment = models.IntegerField(default=0, verbose_name=‘评论量’)
is_delete = models.BooleanField(default=False, verbose_name=‘逻辑删除’)
class Meta:
db_table = 'tb_books' # 指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.btitle
#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
GENDER_CHOICES = (
(0, ‘female’),
(1, ‘male’)
)
hname = models.CharField(max_length=20, verbose_name=‘名称’)
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name=‘性别’)
hcomment = models.CharField(max_length=200, null=True, verbose_name=‘描述信息’)
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name=‘图书’) # 外键
is_delete = models.BooleanField(default=False, verbose_name=‘逻辑删除’)
class Meta:
db_table = 'tb_heros'
verbose_name = '英雄'
verbose_name_plural = verbose_name
def __str__(self):
return self.hname
查询操作
‘’’
get 获取一个
all filter exclude 获取多个
‘’’
错误操作==
BookInfo.objects.get(id=5)
该条信息不存在 报错
demo_app.models.DoesNotExist: BookInfo matching query does not exist.
BookInfo.objects.get(bread=0)
有多个结果的时候 报错
demo_app.models.MultipleObjectsReturned: get() returned more than one BookInfo – it returned 2!
可以这样使用 get方法 不会报错
try:
book=BookInfo.objects.get(id=0)
# 有且只有一个结果的时候 才会成功
except:
book=None
正确操作==
-
获取满足条件的 (filter)
bobooks=BookInfo.objects.filter(id=1)
book=books.first()
print(book) # 射雕英雄传 -
books=BookInfo.objects.filter(id=0)
print(books) #<QuerySet []>
book=books.first() # books.last()
print(book) # None -
不满足条件的 (exclude)
books=BookInfo.objects.exclude(id=1)
print(books)
<QuerySet [<BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>, <BookInfo: 新书>, <BookInfo: 新书3>]> -
获取全部数据 (all)
books=BookInfo.objects.all() # 所有的
print(books.first()) # 射雕英雄传 -
filter方法
-
#查询书名包含’传’的图书。
book=BookInfo.objects.filter(btitle__contains=‘传’)
print(book) # <QuerySet [<BookInfo: 射雕英雄传>]> -
#查询书名以 '天’开头的图书
#查询书名以 '狐’结尾的图书
book=BookInfo.objects.filter(btitle__startswith=‘天’)
print(book) # <QuerySet [<BookInfo: 天龙八部>]>
books=BookInfo.objects.filter(btitle__endswith=‘狐’)
print(books) # <QuerySet [<BookInfo: 雪山飞狐>]> -
给英雄随便加一条 hcomment 为空的信息 不是字符串
给英雄随便加一条 hcomment 为空字符串的信息
hero=HeroInfo.objects.filter(hcomment=’’)
for i in hero:
print(i.id) # 18hero=HeroInfo.objects.filter(hcomment=None)
hero=HeroInfo.objects.filter(hcomment__isnull=True)
for i in hero:
print(i.id) # 19 -
book=BookInfo.objects.filter(bread__in=[12,36,20])
book=BookInfo.objects.filter(bread__range=[12,50])
book=BookInfo.objects.filter(bread__in=[i for i in range(12,50)])
print(book) #
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>]> -
books=BookInfo.objects.filter(bpub_date__year__gt=‘1990’)
books=BookInfo.objects.filter(bpub_date__month__gt=‘10’)
books=BookInfo.objects.filter(bpub_date__day__gt=‘20’)每周的第一天是周日
books=BookInfo.objects.filter(bpub_date__week_day=‘1’)
year、month、day、week_day、hour、minute、second
bpub_date:年月日 bpub_date__year 年 __gt 大于
print(books)
-
例:查询阅读量大于等于评论量的图书。
from django.db.models import F
一个对象的两个字段之间的进行比较 F(‘另外一个字段名’)
book=BookInfo.objects.exclude(bread=0).filter(bread__gte=F(‘bcomment’))
print(book)
books=BookInfo.objects.exclude(bread=0).filter(bread__gte=F(‘bcomment’)*2)
print(books)<QuerySet [<BookInfo: 雪山飞狐>]>
-
Q对象
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
例:查询阅读量大于20,并且编号小于3的图书。
book=BookInfo.objects.filter(bread__gt=20,id__lt=3)
print(book)<QuerySet [<BookInfo: 天龙八部>]>
例:查询阅读量大于20,或编号小于3的图书。
book=BookInfo.objects.filter(Q(bread__gt=20)|Q(id__lt=3))
print(book)
#<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>]> -
# 例:查询图书的总阅读量。 from django.db.models import Sum,Avg,Count,Min,Max books=BookInfo.objects.all() # 从数据库中取了所有的书的数据 (取回的数据量大) bread_count=0 for i in books: bread_count+=i.bread # 累加 需要遍历 print(bread_count) # 126 book=BookInfo.objects.aggregate(Sum('bread'), Avg('bread'), Count('bread'), Min('bread'), Max('bread')) # 数据库给累加的 快速高效 print(book) # 聚合函数 Avg平均 Count 数量 Max 最大 Min最小 Sum 求和 {'bread__sum': 126, 'bread__avg': 21.0, 'bread__count': 6, 'bread__min': 0, 'bread__max': 58}
-
books=BookInfo.objects.all().order_by('bread') print(books) books=BookInfo.objects.all().order_by('-bread') print(books)
-
关联查询
# 关联查询 两方 从一方查另外一方 关联查询
book_1=BookInfo.objects.get(id=1)hero=HeroInfo.objects.get(id=1) book=hero.hbook # 是英雄所在书籍的对象 print(book.id) print(book.btitle) # 所属关系 英雄是属于书的 外键要在英雄里面写 # 通过英雄查书 说书是属于作者的 两个表的关系 不是一个关系的时候 # 获取图书的英雄 book=BookInfo.objects.get(id=1) # 管理器 管理外键关系 heros=book.heroinfo_set.all() # 集合 print(heros) related_name='' 重写 默认多出来的字段的名称 # 被指向模型 默认会多出来一个字段 heroinfo_set ''' class Teacher(): name='' class Person(): name='' friend=fk(Teacher,related_name='friends') teacher=fk(Teacher,related_name='students') '''
11.关联 过滤查询 # 过滤查询 条件是关联模型的属性 heros=HeroInfo.objects.filter(hbook__btitle__contains='传') print(heros) books=BookInfo.objects.filter(heroinfo__hname__startswith='郭') print(books) books=BookInfo.objects.filter(heroinfo__hcomment__contains='掌') print(books.distinct()) # 模型集的去重方法
-