django 面试题

面试题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实现复杂查询

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‘

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

  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和平均成绩;

      rows = Student.objects.annotate(avg=Avg("score__number")).filter(avg__gte=60).values("id","avg")
      for row in rows:
      print(row)
    2. 查询所有同学的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)
  1. 查询姓“李”的老师的个数;

    teacher_nums = Teacher.objects.filter(name__startswith="李").count()
    print(teacher_nums)
    • 1
    • 2
  2. 查询没学过“黄老师”课的同学的id、姓名;
    rows = Student.objects.exclude(score__course__teacher__name="黄老师").values(‘id‘,‘name‘)
    for row in rows:
    print(row)
  3. 查询学过id为1和2的所有同学的id、姓名;
    rows = Student.objects.filter(score__course__in=[1,2]).distinct().values(‘id‘,‘name‘)
    for row in rows:
    print(row)
  4. 查询学过“黄老师”所教的所有课的同学的学号、姓名;
    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)
  5. 查询所有课程成绩小于60分的同学的id和姓名;
    students = Student.objects.exclude(score__number__gt=60)
    for student in students:
    print(student)
  6. 查询没有学全所有课的同学的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)
  7. 查询所有学生的姓名、平均分,并且按照平均分从高到低排序;
    students = Student.objects.annotate(avg=Avg("score__number")).order_by("-avg").values(‘name‘,‘avg‘)
    for student in students:
    print(student)
  8. 查询各科成绩的最高和最低分,以如下形式显示:课程ID,课程名称,最高分,最低分:
    courses = Course.objects.annotate(min=Min("score__number"),max=Max("score__number")).values("id",‘name‘,‘min‘,‘max‘)
    for course in courses:
    print(course)
  9. 查询每门课程的平均成绩,按照平均成绩进行排序;
    courses = Course.objects.annotate(avg=Avg("score__number")).order_by(‘avg‘).values(‘id‘,‘name‘,‘avg‘)
    for course in courses:
    print(course)
  10. 统计总共有多少女生,多少男生;
    rows = Student.objects.aggregate(male_num=Count("gender",filter=Q(gender=1)),female_num=Count("gender",filter=Q(gender=2)))
    print(rows)
  11. 将“黄老师”的每一门课程都在原来的基础之上加5分;
    rows = Score.objects.filter(course__teacher__name=‘黄老师‘).update(number=F("number")+5)
    print(rows)
  12. 查询两门以上不及格的同学的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)
  13. 查询每门课的选课人数;
    courses = Course.objects.annotate(student_nums=Count("score__student")).values(‘id‘,‘name‘,‘student_nums‘)
    for course in courses:
    print(course)

原文地址:https://www.cnblogs.com/b02330224/p/9282151.html

时间: 2024-10-09 21:33:10

django 面试题的相关文章

Django面试题积累

Django中models利用orm对MySQL进行查询 https://www.cnblogs.com/xiaoyuanqujing/articles/11728294.html Django ORM查询中select_related和prefetch_related的区别? def select_related(self, *fields) 性能相关:表之间进行join连表操作,一次性获取关联的数据. 总结: 1. select_related主要针一对一和多对一关系进行优化. 2. sel

Django面试题汇总

1.django请求的生命周期? 1.wsgi,请求封装后交给web框架    2.中间件,对请求进行校验或者在请求对象中添加其他相关数据,    3.路由匹配,根据浏览器发送的不同url去匹配不同的视图函数    4.视图函数,在视图函数中进行业务逻辑的处理    5.中间件,对响应的数据进行处理    6.wsgi,将响应的内容发送给浏览器 2.列举django中间件的5个方法?以及django中间件的应用场景? 1.process_request        接收到客户端信息后立即执行,

django目录

Django django——简介 django——web框架简介 django——url(路由)配置 django——模板层 django——视图层 django——模型层之单表 django——模型层之多表操作 django——form组件 Django——Ajax django——会话追踪技术 django——中间件 django——文本编辑器 Django——发送邮件 项目相关:     Django——图书管理系统     BBS+Blog项目开发     django——面试题(仍在

Django 的简单面试题

1. 对Django的认识? #1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. #2.Django内置的ORM跟框架内的其他模块耦合程度高. # 应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利: # 理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛胚房做全新的装修. #3.Django的卖点是超高的开

Django开发常用方法及面试题

1. 对Django的认识? #1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. #2.Django内置的ORM跟框架内的其他模块耦合程度高. #应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利: #理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛胚房做全新的装修. #3.Django的卖点是超高的开发效

Django 必会面试题总结

https://www.cnblogs.com/wenyule/articles/699aa722eb4f9b16acf554df2337ec6f.html#_labelTop 原文地址:https://www.cnblogs.com/sunxiuwen/p/10230380.html

python公司面试题集锦 python面试题大全

问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x, Child1.x, Child2.x Child1.x = 2 print Parent.x, Child1.x, Child2.x Parent.x = 3 print Parent.x, Child1.x, Child2.x 答案 以上代码的

Python面试题整理-更新中

几个链接: 编程零基础应当如何开始学习 Python ? - 路人甲的回答 网易云课堂上有哪些值得推荐的 Python 教程? - 路人甲的回答 怎么用最短时间高效而踏实地学习 Python? - 路人甲的回答 如何学习Python爬虫[入门篇] - 学习编程 - 知乎专栏 Python常用库整理 - 学习编程 - 知乎专栏 学好Python的11个优秀资源 - 学习编程 - 知乎专栏 在开头依然推荐一个Python面试题整理比较好的网站:GitHub : 关于Python的面试题.同样推荐几道

2018年企业运维开发经典面试题

[岗位职责]负责DevOps业务线项目的实施交付工作负责idc机房.私有云.公有云的私有化部署工作负责公司产品的测试.生产环境搭建.维护完善各环境中服务稳定性.监控.日志.部署.安全等需求??[任职要求]计算机相关专业本科毕业,2年以上的工作经验深入理解Linux操作系统.体系结构优秀的脚本语言的开发能力(bash,python)熟悉常用的持续集成工具(例如Jenkins等) 熟悉Linux操作系统,熟悉常用的CentOS/Ubuntu/RedHat,熟悉网络知识熟悉Linux下常用的应用集群.