315道面试题【31-40】

31、求结果

def  num():
    return [lambda x:i*x for i in range(4)]

print([ m(2) for m in num()])

结果为:
[6, 6, 6, 6]

32、列举常见的内置函数?

内置函数

33、only和defer的区别?

pass

34、select_related和prefetch_related的区别?

prefetch_related()和select_related()的设计目的很相似,都是为了减少SQL查询的数量,但是实现的方式不一样。后者是通过JOIN语句,
在SQL查询内解决问题。但是对于多对多关系,使用SQL语句解决就显得有些不太明智,因为JOIN得到的表将会很长,会导致SQL语句运行时
间的增加和内存占用的增加。若有n个对象,每个对象的多对多字段对应Mi条,就会生成Σ(n)Mi 行的结果表。prefetch_related()的解决
方法是,分别查询每个表,然后用Python处理他们之间的关系。

因为select_related()总是在单次SQL查询中解决问题,而prefetch_related()会对每个相关表进行SQL查询,因此select_related()的效率通常比后者高。

35、filter和exclude的区别?

filter(**kwargs)
返回一个匹配查询参数的新的结果集.
exclude(**kwargs)
返回一个不匹配查询参数的新的结果集.

36、列举django orm中三种能写sql语句的方法。

from django.db import connection
# 获得一个游标cursor对象
cursor = connection.cursor()
# 插入操作
cursor.execute("insert into blog_author(name) values('韩寒')")
# 更新操作
cursor.execute("update blog_author set name = '郭敬明' where name = '韩寒' ")
# 删除操作
cursor.execute("delete from blog_author where name = '郭敬明'")
# 查询操作
cursor.execute('select * from blog_author')
# 一条一条的取数据
raw = cursor.fetchone()
# 取出所有数据,以元组的形式返
cursor.fetchall()
# 查看数据表 blog_book 中的所有的对象。
>>> b = Book.objects.raw('select * from blog_book') # raw方法返回的是RawQuerySet的对象,可迭代
>>> for i in b:
	print(i.title)

37、django orm 中如何设置读写分离?

(1)第一种方法:

手动选择要使用的数据库

m1.UserType.objects.using(default).create(title=VVIP)
m2.Users.objects.using(db1).create(name=VVIP,email=xxx)

(2)方法二:

定义一下路由类,自动执行数据类

在seetings 中加入一条配置

DATABASE_ROUTERS = [db_router.Router1,]
class Router1:
                        def db_for_read(self, model, **hints):
                            """
                            Attempts to read auth models go to auth_db.
                            """
                            if model._meta.model_name == usertype:
                                return db1
                            else:
                                return default

                        def db_for_write(self, model, **hints):
                            """
                            Attempts to write auth models go to auth_db.
                            """
                            return default
为读写操作指定类

这样在执行查询和修改时候就无需指定数据库

38、F和Q的作用?

F:操作数据表中的某列值,F()允许Django在未实际链接数据的情况下具有对数据库字段的值的引用,不用获取对象放在内存中再对字段进行操作,直接执行原生产sql语句操作。

通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交

Q:对对象进行复杂查询,并支持&(and),|(or),~(not)操作符。

39、values和values_list的区别?

values方法可以获取number字段的字典列表。

values_list可以获取number的元组列表。

values_list方法加个参数flat=True可以获取number的值列表。

40、如何使用django orm批量创建数据?

批量插入数据的时候,首先要 创建一个对象的列表 ,然后调用 bulk_create 方法,一次将列表中的数据插入到数据库中。



猜你喜欢

转载自blog.csdn.net/qq_37275405/article/details/80920161