django 面试题
面试题1:migrate怎么判断哪些迁移脚本需要执行:
他会将代码中的迁移脚本和数据库中django_migrations中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移脚本。
面试题2:migrate做了什么事情:
- 将相关的迁移脚本翻译成SQL语句,在数据库中执行这个SQL语句。
- 如果这个SQL语句执行没有问题,那么就会将这个迁移脚本的名字记录到
django_migrations中。
面试题3:执行migrate命令的时候报错的解决办法:
原因:
执行migrate命令会报错的原因是。数据库的django_migrations表中的迁移版本记录和代码中的迁移脚本不一致导致的。
解决办法:
使用–fake参数:
首先对比数据库中的迁移脚本和代码中的迁移脚本。然后找到哪个不同,之后再使用--fake,将代码中的迁移脚本添加到django_migrations中,但是并不会执行sql语句。这样就可以避免每次执行migrate的时候,都执行一些重复的迁移脚本。
终极解决方案:
如果代码中的迁移脚本和数据库中的迁移脚本实在太多,就是搞不清了。那么这时候就可以使用以下终极解决方案:
1. 终极解决方案原理:就是将之前的那些迁移脚本都不用了。重新来过。要将出问题的app下的所有模型和数据库中表保持一致,重新映射。
2. 将出问题的app下的所有模型,都和数据库中的表保持一致。
3. 将出问题的app下的所有迁移脚本文件都删掉。再在django_migrations表中将出问题的app相关的迁移记录都删掉。
4. 使用makemigrations,重新将模型生成一个迁移脚本。
5. 使用migrate --fake-initial参数,将刚刚生成的迁移脚本,标记为已经完成(因为这些模型相对应的表,其实都已经在数据库中存在了,不需要重复执行了。)
6. 可以做其他的映射了。
ORM实现复杂查询
from django.db import models class Student(models.Model):
"""学生表"""
name = models.CharField(max_length=100)
gender = models.SmallIntegerField() class Meta:
db_table = 'student' class Course(models.Model):
"""课程表"""
name = models.CharField(max_length=100)
teacher = models.ForeignKey("Teacher",on_delete=models.SET_NULL,null=True)
class Meta:
db_table = 'course' class Score(models.Model):
"""分数表"""
student = models.ForeignKey("Student",on_delete=models.CASCADE)
course = models.ForeignKey("Course",on_delete=models.CASCADE)
number = models.FloatField() class Meta:
db_table = 'score' class Teacher(models.Model):
"""老师表"""
name = models.CharField(max_length=100) class Meta:
db_table = 'teacher'
使用之前学到过的操作实现下面的查询操作:
查询平均成绩大于60分的同学的id和平均成绩;
查询所有同学的id、姓名、选课的数量、总成绩;
查询姓“李”的老师的个数;
查询没学过“李老师”课的同学的id、姓名;
查询学过课程id为1和2的所有同学的id、姓名;
查询学过“黄老师”所教的“所有课”的同学的id、姓名;
查询所有课程成绩小于60分的同学的id和姓名;
查询没有学全所有课的同学的id、姓名;
查询所有学生的姓名、平均分,并且按照平均分从高到低排序;
查询各科成绩的最高和最低分,以如下形式显示:课程ID,课程名称,最高分,最低分;
查询没门课程的平均成绩,按照平均成绩进行排序;
统计总共有多少女生,多少男生;
将“黄老师”的每一门课程都在原来的基础之上加5分;
查询两门以上不及格的同学的id、姓名、以及不及格课程数;
查询每门课的选课人数;
参考答案:
查询平均成绩大于60分的同学的id和平均成绩;
rows = Student.objects.annotate(avg=Avg("score__number")).filter(avg__gte=60).values("id","avg")
for row in rows:
print(row)查询所有同学的id、姓名、选课的数、总成绩;
rows = Student.objects.annotate(course_nums=Count("score__course"),total_score=Sum("score__number"))
.values("id","name","course_nums","total_score")
for row in rows:
print(row)
查询姓“李”的老师的个数;
teacher_nums = Teacher.objects.filter(name__startswith="李").count()
print(teacher_nums)- 1
- 2
查询没学过“黄老师”课的同学的id、姓名;
rows = Student.objects.exclude(score__course__teacher__name="黄老师").values('id','name')
for row in rows:
print(row)查询学过id为1和2的所有同学的id、姓名;
rows = Student.objects.filter(score__course__in=[1,2]).distinct().values('id','name')
for row in rows:
print(row)查询学过“黄老师”所教的所有课的同学的学号、姓名;
rows = Student.objects.annotate(nums=Count("score__course",filter=Q(score__course__teacher__name='黄老师')))
.filter(nums=Course.objects.filter(teacher__name='黄老师').count()).values('id','name')
for row in rows:
print(row)查询所有课程成绩小于60分的同学的id和姓名;
students = Student.objects.exclude(score__number__gt=60)
for student in students:
print(student)查询没有学全所有课的同学的id、姓名;
students = Student.objects.annotate(num=Count(F("score__course"))).filter(num__lt=Course.objects.count()).values('id','name')
for student in students:
print(student)查询所有学生的姓名、平均分,并且按照平均分从高到低排序;
students = Student.objects.annotate(avg=Avg("score__number")).order_by("-avg").values('name','avg')
for student in students:
print(student)查询各科成绩的最高和最低分,以如下形式显示:课程ID,课程名称,最高分,最低分:
courses = Course.objects.annotate(min=Min("score__number"),max=Max("score__number")).values("id",'name','min','max')
for course in courses:
print(course)查询每门课程的平均成绩,按照平均成绩进行排序;
courses = Course.objects.annotate(avg=Avg("score__number")).order_by('avg').values('id','name','avg')
for course in courses:
print(course)统计总共有多少女生,多少男生;
rows = Student.objects.aggregate(male_num=Count("gender",filter=Q(gender=1)),female_num=Count("gender",filter=Q(gender=2)))
print(rows)将“黄老师”的每一门课程都在原来的基础之上加5分;
rows = Score.objects.filter(course__teacher__name='黄老师').update(number=F("number")+5)
print(rows)查询两门以上不及格的同学的id、姓名、以及不及格课程数;
students = Student.objects.annotate(bad_count=Count("score__number",filter=Q(score__number__lt=60))).filter(bad_count__gte=2).values('id','name','bad_count')
for student in students:
print(student)查询每门课的选课人数;
courses = Course.objects.annotate(student_nums=Count("score__student")).values('id','name','student_nums')
for course in courses:
print(course)
django 面试题的更多相关文章
- django——面试题(已工作,暂停更新)
谈谈你对HTTP协议的认识. 什么是协议? 协议,是指通信的双方,在通信流程或内容格式上,共同遵守的标准. 什么是http协议? http协议,是互联网中最常见的网络通信标准. http协议的特点 ① ...
- django面试题
1. 对Django的认识? #1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. #2.D ...
- django面试题必知
Django的Model的继承有几种形式,分别是什么?(私信小编001 .002 .003 .007任何一个即可获取Python学习资料) 一.抽象继承: 这种继承的定义方法如下: 上例中,我们的Hu ...
- django面试题必问
1.谈谈你对http协议的认识. HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使 ...
- Django面试题(附带答案)
总结的一些Django中会问的问题,希望对你们有用. 1. Django的生命周期 当用户在浏览器输入url时,浏览器会生成请求头和请求体发送给服务端,url经过Django中的wsgi时请求对象创建 ...
- Django合集
Django基础 Django--简介 Django--web框架简介 浅析uWSGI.uwsgi.wsgi Django--url(路由)配置 Django--模板层 Django--视图层 Dja ...
- Django 的认识,面试题
Django 的认识,面试题 1. 对Django的认识? #1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全 ...
- Django相关面试题
Django框架的生命请求周期 浏览器上输入地址,回车然后发生了什么? => Http请求生命周期 ? 什么是wsgi 以及作用? 中间件 中间件的执行流程? 中间件的执行流程? 说一下Djan ...
- Django 必会面试题总结
1 列举Http请求中常见的请求方式 HTTP请求的方法: HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式 注意: 1)方法名称是 ...
随机推荐
- 使用git版本管理工具
1.(1)正常提交:git add 提交文件 git init //git init之后建立一个.gitignore可以避免node_modules这类文件夹提交 git add . git co ...
- 我为什么不用Django而用Flask?
前言 对于初学者来说,找到一个好的框架来学习或者项目开发都是非常有必要的,而当你有一定开发经验后,你应该选择适合当前业务需要的框架.我这里并不想探讨哪个框架好哪个不好,这个永恒的话题就跟探讨“世界上哪 ...
- SQL Server2008宝典 全书代码
-- ============================================= -- Create database template -- ==================== ...
- 避免Autoclose和Autoshrink选项
避免Autoclose和Autoshrink选项发布日期:2001年12月18日 问题:我在Microsoft SQL Server 2000资源工具包中读到了一个用于就应当避免使用的选项对所有数据库 ...
- 启动eclipse出现“Error opening registry key 'software\Javasoft\Java Runtime Environment'”
启动eclipse出现“Error opening registry key 'software\Javasoft\Java Runtime Environment'”,“java was start ...
- Asio基本接口
Asio是C++的网络库,有boost和非boost这两种版本,这里涉及的都是非boost的版本.Asio官方文档 在使用Asio时可以只包含头文件asio.hpp,如果知道所用接口具体在哪个头文件中 ...
- 第二次Surm冲刺
一.小组完成情况: 因为技术原因,小组部分代码还没有完成,现在已经可以实现简单的借书与还书操作. 二.个人情况 我对代码进行了测试,与大家进相关的讨论. 三.总结 这次实验的团队合作真的很重要,有许多 ...
- Fiori Launchpad Tile点击后跳转的调试技巧
在SAP Fiori launchpad 里点击某个tile之后,后台会计算出跳转的目标url返回给前台. 下图中一个个白色的方框就成为tile.每个tile点击之后,会打开一个对应的Fiori应用. ...
- wireshark抓取本地回环数据包
linux环境下,用tcpdump,可以用-i lo参数抓取环回接口的包.如果服务端和客户端安装在同一台机器上,调试时是很方便的.linux版的wireshark,选取网卡的菜单里也有lo选项,也 ...
- UVALive 6261 Jewel heist
题意:珠宝大盗Arsen Lupin偷珠宝.在展厅内,每颗珠宝有个一个坐标为(xi,yi)和颜色ci. Arsen Lupin发明了一种设备,可以抓取平行x轴的一条线段下的所有珠宝而不触发警报, 唯一 ...