1 图书相关表关系建立
1 5个表
2 书籍表,作者表,作者详情表,出版社表,书籍和作者表(多对多关系)
3 一对一的关系,关联字段可以写在任意一方
4 一对多的关系,关联字段写在多的一方
5 多对多的关系,必须建立第三张表(orm中,可以用一个字段表示,这个字段可以写在任意一方)
5 把表关系同步到数据库中
-python3 manage.py makemigrations
-python3 manage.py migrate
6 表关系
from django.db import models
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField()
class Book(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_date = models.DateField()
publish = models.ForeignKey(to=Publish,to_field='nid',on_delete=models.CASCADE)
authors=models.ManyToManyField(to='Author')
def __str__(self):
return self.name
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='AuthorDatail',to_field='nid',unique=True,on_delete=models.CASCADE)
class AuthorDatail(models.Model):
nid = models.AutoField(primary_key=True)
telephone = models.BigIntegerField()
birthday = models.DateField()
addr = models.CharField(max_length=64)
2基于双下划线的跨表查询
1 基于对象的跨表查
-子查询,多次查询
2 基于双下划线的跨表查
-多表连接查询
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
if __name__ == '__main__':
import django
django.setup()
from app01 import models
res=models.Book.objects.filter(publish__name='北京出版社')\
.values('publish__name','name','authors__name','authors__author_detail__addr')
res=models.Publish.objects.filter(name='北京出版社').values('name','book__name','book__authors__name','book__authors__author_detail__addr')
res=models.Author.objects.filter(book__publish__name='北京出版社').values('book__publish__name','book__name','name','author_detail__addr')
res=models.AuthorDatail.objects.filter(author__book__publish__name='北京出版社').values('author__book__publish__name','author__book__name','author__name','addr')
print(res)
3 聚合查询
1 聚合函数,sum,max,min,count,avg
2 把聚合结果字段重命名
res=models.Book.objects.all().aggregate(aaa=Sum('price'))
res=models.Book.objects.all().aggregate(book_sum=Sum('price'),book_avg=Avg('price'))
print(res)
4F查询
from django.db.models import F
res=models.Book.objects.all().update(price=F('price')+1)
print(res)
5 Q查询
from django.db.models import Q
res=models.Book.objects.filter(~Q(name='红楼梦'))
res = models.Book.objects.filter(~Q(name='红楼梦')&Q(price__gt='100'))
print(res)
补充:
1 普通函数以__开头
-说明当前函数只在当前模块(py)下使用,尽量不在外部调用
2 mysql
-utf8:2个字节表示一个字符
-utf8mb4:等同于真正意义上的utf-8
-utf-8:1--4个字节,表示一个字符
3 django 的orm使用pymysql连接mysql
-需要加这一句话(本质就是猴子补丁的应用)
import pymysql
pymysql.install_as_MySQLdb()
-本质是想让它执行,放在哪都可以
-init中
-settings.py中
djago admin的使用
1 后台管理,方便我们快速的录入书籍
2 使用方法:
第一步:在admin.py 中把要使用的表注册
from app01 import models
admin.site.register(models.Book)
admin.site.register(models.Author)
admin.site.register(models.AuthorDatail)
admin.site.register(models.Publish)
第二步:创建个超级管理员
python3 manage.py createsuperuser
输入用户名,输入密码
第三步:登录,录入书籍
-http://127.0.0.1:8000/admin/
使用脚本调用django
1 写一个脚本文件
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
if __name__ == '__main__':
import django
django.setup()
from app01 import models
django查看原生sql
1 queryset对象.query
2 通过日志,如下,配置到setting.py中
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?