django数据库讲课文案
课程前期准备
默认数据库配置sqlite
DATABASES = { |
修改为mysql
DATABASES = { |
创建app
startapp <app_label>
下载mysqlclient
INSTALLED_APPS = ( |
- 创建book类
class Book(models.Model): |
makemigrations |
配置url
urlpatterns = [ |
增
- view.py
from django.shortcuts import render,HttpResponse |
查询
all()
, filter
, exclude()
, get()
, order_by()
, first()
, __contains
, __range
删
使用模型类的 对象.delete()
使用 QuerySet 类型数据.delete()
改
- ```
模型类的对象.属性 = 更改的属性值
模型类的对象.save()insert into app02_publish(name,city,email) values (“华山出版社”, “华山”, “[email protected]”), (“明教出版社”, “黑木崖”, “[email protected]”)
* QuerySet 类型数据.update(字段名=更改的数据)
> `objects` 是该模型的默认管理器。通过这个管理器,你可以执行各种数据库查询操作
SQL语句
先插入 authordetail 表中多数据
insert into app02_authordetail(gender,tel,addr,birthday) values (1,13432335433,”华山”,”1994-5-23”), (1,13943454554,”黑木崖”,”1961-8-13”), (0,13878934322,”黑木崖”,”1996-5-20”)
再将数据插入 author,这样 author 才能找到 authordetail
insert into app02_author(name,age,au_detail_id) values (“令狐冲”,25,1), (“任我行”,58,2), (“任盈盈”,23,3)
|
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
pub_date = models.DateField()
publish = models.ForeignKey(“Publish”, on_delete=models.CASCADE)
authors = models.ManyToManyField(“Author”)
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=64)
email = models.EmailField()
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.SmallIntegerField()
au_detail = models.OneToOneField(“AuthorDetail”, on_delete=models.CASCADE)
class AuthorDetail(models.Model):
gender_choices = (
(0, “女”),
(1, “男”),
(2, “保密”),
)
gender = models.SmallIntegerField(choices=gender_choices)
tel = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
birthday = models.DateField()
|
def add_book(request):
# 获取出版社对象
pub_obj = models.Publish.objects.filter(pk=1).first()
# 给书籍的出版社属性publish传出版社对象
book = models.Book.objects.create(title="菜鸟教程", price=200, pub_date="2010-10-10", publish=pub_obj)
print(book, type(book))
return HttpResponse(book)
def add_book(request):
# 获取出版社对象
pub_obj = models.Publish.objects.filter(pk=1).first()
# 获取出版社对象的id
pk = pub_obj.pk
# 给书籍的关联出版社字段 publish_id 传出版社对象的id
book = models.Book.objects.create(title="冲灵剑法", price=100, pub_date="2004-04-04", publish_id=pk)
print(book, type(book))
return HttpResponse(book)
|
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
创建作者和书籍对象
author = Author.objects.create(name=’John Smith’)
book1 = Book.objects.create(title=’Book 1’, author=author)
book2 = Book.objects.create(title=’Book 2’, author=author)
通过 Author 模型的小写名称 + “_set” 访问与作者相关的书籍
books = author.book_set.all()
打印作者的书籍
for book in books:
print(book.title)
输出:
Book 1
Book 2
|
pythonCopy codefrom django.db import models
class Song(models.Model):
title = models.CharField(max_length=100)
tags = models.ManyToManyField(‘Tag’)
class Tag(models.Model):
name = models.CharField(max_length=50)
|
pythonCopy coderock = Tag.objects.create(name=’Rock’)
pop = Tag.objects.create(name=’Pop’)
song1 = Song.objects.create(title=’Song 1’)
song1.tags.add(rock)
song2 = Song.objects.create(title=’Song 2’)
song2.tags.add(rock, pop)
|
pythonCopy code# 找到具有特定标签的歌曲
rock_songs = Song.objects.filter(tags__name=’Rock’)
找到特定歌曲的标签
song_tags = song1.tags.all()
|
pythonCopy code# 为歌曲添加标签
song1.tags.add(pop)
为歌曲删除标签
song2.tags.remove(rock)
|
pythonCopy code# 找到具有特定标签的所有歌曲
rock_songs = rock.song_set.all()
|
用法:
F(“字段名称”)
F 动态获取对象字段的值,可以进行运算。
Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取余的操作。
修改操作(update)也可以使用 F() 函数。
res = models.Book.objects.update(price=F("price")+100) |
Q() 查询
使用前要先从 django.db.models 引入 Q:
from django.db.models import Q
用法:
Q(条件判断)
例如:
Q(title__startswith=”菜”)
之前构造的过滤器里的多个条件的关系都是 and,如果需要执行更复杂的查询(例如 or 语句),就可以使用 Q 。
Q 对象可以使用 & | ~ (与 或 非)操作符进行组合。
优先级从高到低:~ & |。
可以混合使用 Q 对象和关键字参数,Q 对象和关键字参数是用”and”拼在一起的(即将逗号看成 and ),但是 Q 对象必须位于所有关键字参数的前面。
res=models.Book.objects.filter(Q(price__gt=350)|Q(title__startswith="菜")).values("title","price") |
附加
class Meta: |
抽象类模型(Abstract Base Class):
- 抽象类模型是一种不会被数据库创建的模型。它不会生成数据库表,而仅用于继承。
- 用于将共享的字段和方法封装在一个基类中,以供多个子类模型继承和重用。
- 抽象类模型通常包含一些通用的字段和方法,可以在多个模型中共享。
- 不能直接使用抽象类模型创建数据库记录,只能通过子类模型创建记录。
示例:
pythonCopy codefrom django.db import models |
代理类模型(Proxy Model):
- 代理类模型是一个已存在模型的代理,它可以被用来扩展或修改现有模型的行为,而不需要修改原始模型。
- 代理类模型基于现有模型创建,因此它与原始模型共享相同的数据库表。
- 代理类模型可以用于添加新方法、属性或定制查询,而不会对数据库结构产生影响。
示例:
pythonCopy codefrom django.db import models |