python(3.6) django(1.11.1)问题积累

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31340657/article/details/79538356

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 依次运算,

三.缓存

http://www.maiziedu.com/wiki/django/open/ 参考此处

猜你喜欢

转载自blog.csdn.net/qq_31340657/article/details/79538356