面试题1:migrate怎么判断哪些迁移脚本需要执行:

他会将代码中的迁移脚本和数据库中django_migrations中的迁移脚本进行对比,如果发现数据库中,没有这个迁移脚本,那么就会执行这个迁移脚本。

面试题2:migrate做了什么事情:

  1. 将相关的迁移脚本翻译成SQL语句,在数据库中执行这个SQL语句。
  2. 如果这个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实现复杂查询

  1. from django.db import models
  2.  
  3. class Student(models.Model):
  4. """学生表"""
  5. name = models.CharField(max_length=100)
  6. gender = models.SmallIntegerField()
  7.  
  8. class Meta:
  9. db_table = 'student'
  10.  
  11. class Course(models.Model):
  12. """课程表"""
  13. name = models.CharField(max_length=100)
  14. teacher = models.ForeignKey("Teacher",on_delete=models.SET_NULL,null=True)
  15. class Meta:
  16. db_table = 'course'
  17.  
  18. class Score(models.Model):
  19. """分数表"""
  20. student = models.ForeignKey("Student",on_delete=models.CASCADE)
  21. course = models.ForeignKey("Course",on_delete=models.CASCADE)
  22. number = models.FloatField()
  23.  
  24. class Meta:
  25. db_table = 'score'
  26.  
  27. class Teacher(models.Model):
  28. """老师表"""
  29. name = models.CharField(max_length=100)
  30.  
  31. class Meta:
  32. db_table = 'teacher'

使用之前学到过的操作实现下面的查询操作:

  1. 查询平均成绩大于60分的同学的id和平均成绩;

  2. 查询所有同学的id、姓名、选课的数量、总成绩;

  3. 查询姓“李”的老师的个数;

  4. 查询没学过“李老师”课的同学的id、姓名;

  5. 查询学过课程id为1和2的所有同学的id、姓名;

  6. 查询学过“黄老师”所教的“所有课”的同学的id、姓名;

  7. 查询所有课程成绩小于60分的同学的id和姓名;

  8. 查询没有学全所有课的同学的id、姓名;

  9. 查询所有学生的姓名、平均分,并且按照平均分从高到低排序;

  10. 查询各科成绩的最高和最低分,以如下形式显示:课程ID,课程名称,最高分,最低分;

  11. 查询没门课程的平均成绩,按照平均成绩进行排序;

  12. 统计总共有多少女生,多少男生;

  13. 将“黄老师”的每一门课程都在原来的基础之上加5分;

  14. 查询两门以上不及格的同学的id、姓名、以及不及格课程数;

  15. 查询每门课的选课人数;

参考答案:

    1. 查询平均成绩大于60分的同学的id和平均成绩;

      1. rows = Student.objects.annotate(avg=Avg("score__number")).filter(avg__gte=60).values("id","avg")
      2. for row in rows:
      3. print(row)
    2. 查询所有同学的id、姓名、选课的数、总成绩;

      1. rows = Student.objects.annotate(course_nums=Count("score__course"),total_score=Sum("score__number"))
      2. .values("id","name","course_nums","total_score")
      3. for row in rows:
      4. print(row)
  1. 查询姓“李”的老师的个数;

    1. teacher_nums = Teacher.objects.filter(name__startswith="李").count()
    2. print(teacher_nums)
    • 1
    • 2
  2. 查询没学过“黄老师”课的同学的id、姓名;

    1. rows = Student.objects.exclude(score__course__teacher__name="黄老师").values('id','name')
    2. for row in rows:
    3. print(row)
  3. 查询学过id为1和2的所有同学的id、姓名;

    1. rows = Student.objects.filter(score__course__in=[1,2]).distinct().values('id','name')
    2. for row in rows:
    3. print(row)
  4. 查询学过“黄老师”所教的所有课的同学的学号、姓名;

    1. rows = Student.objects.annotate(nums=Count("score__course",filter=Q(score__course__teacher__name='黄老师')))
    2. .filter(nums=Course.objects.filter(teacher__name='黄老师').count()).values('id','name')
    3. for row in rows:
    4. print(row)
  5. 查询所有课程成绩小于60分的同学的id和姓名;

    1. students = Student.objects.exclude(score__number__gt=60)
    2. for student in students:
    3. print(student)
  6. 查询没有学全所有课的同学的id、姓名;

    1. students = Student.objects.annotate(num=Count(F("score__course"))).filter(num__lt=Course.objects.count()).values('id','name')
    2. for student in students:
    3. print(student)
  7. 查询所有学生的姓名、平均分,并且按照平均分从高到低排序;

    1. students = Student.objects.annotate(avg=Avg("score__number")).order_by("-avg").values('name','avg')
    2. for student in students:
    3. print(student)
  8. 查询各科成绩的最高和最低分,以如下形式显示:课程ID,课程名称,最高分,最低分:

    1. courses = Course.objects.annotate(min=Min("score__number"),max=Max("score__number")).values("id",'name','min','max')
    2. for course in courses:
    3. print(course)
  9. 查询每门课程的平均成绩,按照平均成绩进行排序;

    1. courses = Course.objects.annotate(avg=Avg("score__number")).order_by('avg').values('id','name','avg')
    2. for course in courses:
    3. print(course)
  10. 统计总共有多少女生,多少男生;

    1. rows = Student.objects.aggregate(male_num=Count("gender",filter=Q(gender=1)),female_num=Count("gender",filter=Q(gender=2)))
    2. print(rows)
  11. 将“黄老师”的每一门课程都在原来的基础之上加5分;

    1. rows = Score.objects.filter(course__teacher__name='黄老师').update(number=F("number")+5)
    2. print(rows)
  12. 查询两门以上不及格的同学的id、姓名、以及不及格课程数;

    1. 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')
    2. for student in students:
    3. print(student)
  13. 查询每门课的选课人数;

    1. courses = Course.objects.annotate(student_nums=Count("score__student")).values('id','name','student_nums')
    2. for course in courses:
    3. print(course)

django 面试题的更多相关文章

  1. django——面试题(已工作,暂停更新)

    谈谈你对HTTP协议的认识. 什么是协议? 协议,是指通信的双方,在通信流程或内容格式上,共同遵守的标准. 什么是http协议? http协议,是互联网中最常见的网络通信标准. http协议的特点 ① ...

  2. django面试题

    1. 对Django的认识?   #1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. #2.D ...

  3. django面试题必知

    Django的Model的继承有几种形式,分别是什么?(私信小编001 .002 .003 .007任何一个即可获取Python学习资料) 一.抽象继承: 这种继承的定义方法如下: 上例中,我们的Hu ...

  4. django面试题必问

    1.谈谈你对http协议的认识. HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使 ...

  5. Django面试题(附带答案)

    总结的一些Django中会问的问题,希望对你们有用. 1. Django的生命周期 当用户在浏览器输入url时,浏览器会生成请求头和请求体发送给服务端,url经过Django中的wsgi时请求对象创建 ...

  6. Django合集

    Django基础 Django--简介 Django--web框架简介 浅析uWSGI.uwsgi.wsgi Django--url(路由)配置 Django--模板层 Django--视图层 Dja ...

  7. Django 的认识,面试题

    Django 的认识,面试题 1. 对Django的认识? #1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全 ...

  8. Django相关面试题

    Django框架的生命请求周期 浏览器上输入地址,回车然后发生了什么? => Http请求生命周期 ? 什么是wsgi 以及作用? 中间件 中间件的执行流程? 中间件的执行流程? 说一下Djan ...

  9. Django 必会面试题总结

    1 列举Http请求中常见的请求方式 HTTP请求的方法: HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式   注意: 1)方法名称是 ...

随机推荐

  1. C语言入门(一)环境搭建

    1. 下载Code::Blocks(源文本编辑器) 2. 下载编译器MinGW(或者下载好自带编译器的codeblocks) http://jingyan.baidu.com/article/c843 ...

  2. Java入门到精通——框架篇之Spring源码分析Spring两大核心类

    一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.spri ...

  3. python 学习 (迟到的2017小结)

    2017过去了,从前端开发转测试,入行一年多,写了web的UI自动化测试框架,看了python基础教程,核心编程,算是入门python了吧.目前呢,想开发个接口的自动化测试平台.           ...

  4. oracle_How to Recover Data (Without a Backup!)

    How to Recover Data (Without a Backup!) It's the classic career-limiting maneuver(职业限制机动): accidenta ...

  5. 从github下载一个单一文件

    以ubuntu + wget为例 1) 浏览器中打开需要需要下载的文件 2) 点击 raw按钮 3) 从浏览器地址栏中拷贝地址 4) wget + 地址

  6. 为什么有的系统的事务码BSP_WD_CMPWB看不见Enhance Component这个按钮

    我的同事问我,为什么有的系统看不到下图7的按钮? 对比两张图里工具栏的差异. 答案 这是因为在图2(看不见Enhance Component按钮)的系统里,该系统的类型被设置为"SAP&qu ...

  7. 设计模式——策略模式(Strategy Pattern)

    写在前面: 直接将书中的例子用来作为记录自己学习的成果,不知道这样好不好,如果给原作者带来什么不利的影响不妨告知一声,我及时删掉. UML图: 抽象策略:Strategy package com.cn ...

  8. 前端HTML5几种存储方式

    h5之前,存储主要是用cookies.cookies缺点有在请求头上带着数据,大小是4k之内.主Domain污染. 主要应用:购物车.客户登录 对于IE浏览器有UserData,大小是64k,只有IE ...

  9. 「SDOI2008沙拉公主的困惑」

    题目 看着有点可怕 求 \[\sum_{i=1}^{n!}[(i,m!)=1]\] 考虑一下\(m=n\)的时候的答案 非常显然就是\(\varphi(m!)\) 而如果\(n>m\) 非常显然 ...

  10. 【[SDOi2012]Longge的问题】

    求\(\sum_{i=1}^ngcd(i,n)\) 考虑枚举\(gcd\),现在答案变成这样 \(\sum_{d|n}d*f(d)\) \(f(d)=\sum_{i=1}^n [gcd(i,n)==d ...