python的学习是需要总结并且记录的,任何的弱类型语言都需要这样,因为不向强类型语言一样,他会自动提示,你只要知道思路,其中的字段或者方法是很容易提示出来的,而弱类型语言很多时候都是不会提示的,所以有时你必须自己书写出精准的单词,当然也可以去查源代码,找到方法名,但是有时候源代码都链接不到.
所以对于弱类型语言,最好的学习方法是记录
一.django 数据库操作
1.django manytomany字段操作
比如老师与班级的关系,一个老师可以给多个班级上课,一个班级也有多个老师,这就是多对多,此时可以在班级的model中定义teachers字段,并设置为manytomany的,
取出数据时,先拿到班级对象,然后取出班级中所有的老师,当然也可以通过老师取出他上课的所有的班级,具体操作如下:
a.第一种方式演示
class Teacher(models.Model):
id = models.IntegerField(primary_key=True, verbose_name='id')
name = models.CharField(max_length=12, verbose_name='姓名')
class Clazz(models.Model):
id = models.IntegerField(primary_key=True, verbose_name='id')
name = models.CharField(max_length=25, verbose_name='班级名字')
teachers = models.ManyToManyField(Teacher, verbose_name='所有授课老师')
#下面演示获取多对多关系的数据
teacher = Teacher.objects.first()
clazzs = teacher.clazz_set.all() #获取到这个老师教的所有的班级
clazz = Clazz.objects.first()
teachers = clazz.teachers.all() #获取这个班级所有的老师
b.第二种方式演示
当然在teacher model里面也可以定义clazzs这么一个字段,同样能完成此功能,如果这样的话获取的代码就是如下:
class Teacher(models.Model):
id = models.IntegerField(primary_key=True, verbose_name='id')
name = models.CharField(max_length=12, verbose_name='姓名')
clazzs = models.ManyToManyField(Clazz, verbose_name='老师教授的班级')
class Clazz(models.Model):
id = models.IntegerField(primary_key=True, verbose_name='id')
name = models.CharField(max_length=25, verbose_name='班级名字')
#下面演示获取多对多关系的数据
teacher = Teacher.objects.first()
clazzs = teacher.clazzs.all() #获取到这个老师教的所有的班级
clazz = Clazz.objects.first()
teachers = clazz.teacher_set.all() #获取这个班级所有的老师
c.manytomany情况下添加数据并建立关系
以第二种方式做示例:
teacher = Teacher.objects.first()
clazz = Clazz.objects.create(name='五年二班')
clazz.save()
teacher.courses.add(clazz)
teacher.save()
可以看出来还是很方便的,如果自己建立一张表去做查询也是可以实现的,但是操作起来稍微复杂一点,同时也不好保证这两种数据之间的对应关系一定能做好,用这种方式django已经把数据库的冗余数据降到几乎最低了
2.id字段如何写
id字段最好不要写,让系统自动生成,如果要写,就是id = models.AutoFiled(primary_key=True),记住只能用autofield方式,否则不能自增,而id一般要求是不允许重复,自增的,默认情况下就是如此,所以没必要自己再去定义一次,多麻烦一下而已,如果不用自增的字段,保存的时候必须自己制定id的值,否则保存是会出错的,提示id 这一列不能为空
3.id字段不能改成自增
因为有一条数据的id为0,自增时不允许id为0,所以要把这条数据修改一下
4.非空的model字段在model的create时或之前必须指定否则报错
5.去重复查询
item_ids = user.attendclass_set.values_list('item_id', flat=True).distinct()
上面语句中,attendclass的外键为user,通过user拿到所有的user相关的attendclass,然后以item_id这个字段为过滤条件,去重复查询,
其中flat=True会让结果直接呈现为list[]形式,如果没有这个将呈现为list[tupple()]形式,同时也可用values方法,这样查询出来是dict形式
6.多条查询
items = Item.objects.filter(id__in=[1,4,6])
表示查询id为1,4,6的三条数据,其中id与in之间是用两个_来连接的
7.其他查询
https://www.cnblogs.com/rinka/p/django_make_queries_anout_built-in_lookups.html
二.settings.py
1.debug配置
在需要测试的机器上建立文件/config/debug/[项目名称],然后在settings文件中配置如下:
这样就不需要在正式环境中修改任何东西即可使用,非常方便
DEBUG = os.path.exists('/config/debug/[项目名称]')
if DEBUG:
ALLOWED_HOSTS = ['*']
else:
ALLOWED_HOSTS = ['www.[你的域名].cn']
2.新建项目时userPro的model要在同步之前建立
否则会出现依赖错误
3.python3x用pymysql 替代mysqldb的方法
import pymysql
pymysql.install_as_MySQLdb()
4.使用自定义的用户model
AUTH_USER_MODEL = ‘user.UserPro’
三python基础
1.关于datetimefield
http://blog.sina.com.cn/s/blog_9e2e84050101iltd.html
2.参数传递
def aa(a,b,*args,**kwargs):
print(a,b,args,**kwargs)
print(aa(1,2,3,4,5,e=11,f=12))
结果:1 2 (3,4,5) {‘e’:11,’f’:12}
同样可以:
ee={‘e’:11,’f’:12}
aa(**ee)
结果:{‘e’:11,’f’:12}
3.set相关
python 集合set的创建,更改,遍历,元算合并,交集,补集https://blog.csdn.net/u013679490/article/details/54427471
补充一点:
list 中是否包含
a b 为两个list
set(a)>set(b) a是否包含b
set(b)>set(a) b是否包含a
set(a)==set(b) a,b是否相等,但是要求a,b不能是None
a==b 判断a,b是否相等,a,b可以为None
print(list(set(a).intersection(set(b)))) 求交集
print(list(set(a).union(set(b))))求并集
4.高阶函数
廖雪峰教程引用:
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317849054170d563b13f0fa4ce6ba1cd86e18103f28000
reduce 依次运算,