多表操作


昨日回顾:
1 模板导入
-写一个模板
-{%include '模板名字'%}
2 母版继承
-写一个母版(留几个盒子),名字叫XX
-{% block 名字 %}
{%endblock%}
-使用:继承母版
-{%extends 'XX'%}
-重写盒子(多个盒子,位置无关)
-{% block 名字 %}
写内容
{%endblock%}
3 静态文件相关
方式一
-先创建一个static的文件夹
-settings配置静态文件
-STATICFILES_DIRS=[
os.path.join(BASE_DIR,'static')
]
- <link rel="stylesheet" href="/static/utils/bootstrap-3.3.7-dist/css/bootstrap.css">
-<script src="/static/utils/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
方式二(动态)
-使用:{%load static%}
-<script src="{% static 'utils/bootstrap-3.3.7-dist/js/bootstrap.js'%}"></script>
方式三:
-使用:{%load static%}
-<script src="{% get_static_prefix %}css/mycss.css"></script>

4 单表操作:
-mysql数据库:settings里配置
'default': {
# key值必须都是大写
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day76',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'admin',
}
-在init文件中:
import pymysql
pymysql.install_as_MySQLdb()
-在models中,写类,写类的属性
#自增,int,主键
id = models.AutoField(primary_key=True)
#varchar,长度32
name = models.CharField(max_length=32)
#Decimal 长度5,小数位2位
price = models.DecimalField(max_digits=5, decimal_places=2)
#日期类型,可以为空
create_data=models.DateField(null=True)
-数据库迁移:
python3 manage.py makemigrations --->只是对数据变更,做记录
python3 manage.py migrate ---->把变更,同步到数据库
-新增表,删除表,新增字段,删除字段---->执行数据库迁移的两条命令就可以了
-单表增:
-两种方式
-单表修改:
-先查询出来,然后update(queryset对象的方法)
-对象要更新,用save方法
-单表删除:
-先查询出来,然后delete(queryset对象和模型对象的方法)
*****用queryset删除,修改的时候,一定要注意,数据是几条
-删除数据表中所有数据:Book.objece.all().delete()
-单表查询
-all()
-filter(**kwargs)
-get(**kwargs) 有且只有一条数据
-exclude(**kwargs)
-order_by(*field)
-reverse()
-count()
-first()
-last()
-exists()
-values(*field)
-values_list(*field)
-distinct()
-单表基于双下划线模糊查询
Book.objects.filter(price__in=[100,200,300])
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__gte=100)
Book.objects.filter(price__lte=100)
Book.objects.filter(price__range=[100,200])
Book.objects.filter(title__contains="python")---->%python%
Book.objects.filter(title__endswith="py")----->%py
Book.objects.filter(title__startswith="py")---->py%
Book.objects.filter(title__icontains="python")--->忽略大小写
Book.objects.filter(pub_date__year=2012,pub_date__month=12)

今日内容:
1 创建多表模型(详情见代码)
#用了OneToOneField和ForeignKey,模型表的字段,后面会自定加_id
# ManyToManyField会自动创建第三张表
# *************重点
# 一对一的关系:OneToOneField
# 一对多的关系:ForeignKey
# 多对多的关系:ManyToManyField

2 添加表记录
1 一对多新增
-两种方式:
-publish=对象
-publish_id=id
2 一对多删除:同单表删除
3 一对多修改:两种方式,可以传对象,可以传id
4 一对一跟一对多一样
5 多对多:
-add ----->可以传对象,可以传id,可以传多个
-remove ----->可以传对象,可以传id,可以传多个
-clear ---->没有参数
-set ----->跟上面不一样,必须传列表,列表里面可以是对象,可以是id
3 基于对象的跨表查询
1 一对一
正向:正向查询按字段
反向:反向查询按表名小写
2 一对多
正向:正向查询按字段
反向:反向按表名小写_set.all()
3 多对多
正向:正向查询按字段.all()
反向查询:反向按表名小写_set.all()
4******基于对象的查询,多次查询(子查询)


4 基于双下划线的跨表查询
-连表查询
-一对一双下划线查询
-正向:按字段,跨表可以在filter,也可以在values中
-反向:按表名小写,跨表可以在filter,也可以在values中



作业:
1 图书馆的表模型创建好,插入一些数据
2 基于对象的查询
3 基于双下划线的查询




原文地址:https://www.cnblogs.com/fushaunglin/p/10033455.html