Django去操作已经存在的数据库

2019-11-14 张宇童 Python

Django去操作已经存在的数据库

你有没有遇到过这种情况?

数据库,各种表结构已经创建好了,甚至连数据都有了,此时,我要用Django管理这个数据库,ORM映射怎么办???

Django是最适合所谓的green-field开发,即从头开始一个新的项目

但是呢,Django也支持和以前遗留的数据库和应用相结合的。

Django的数据库层从Python代码生成SQL schemas。但是对于遗留的数据库,你已经用于SQL schemas,这种情况下你需要为你已经存在的数据库表写模型(为了使用数据库的API),幸运的是,Django自带有通过阅读你的数据库表规划来生成模型代码的辅助工具 manage.py inspectdb

 1.Django默认使用的是sqllit数据库?如何使用MySQL数据库?

#修改setting.py文件 
DATABASE = { 
    'default':{ 
        'ENGINE':'django.db.backends.mysql', 
        'NAME':'数据库名', 'HOST':'数据库地址', 
        'PORT':端口, 'USER':'用户名', 
        'PASSWORD':'密码', 
    }
 } 

#由于Django内部链接MySQL数据库的时候默认的是使用MySQLdb的 #但是Python3中没有这个模块 #所以我们要去修改他的project同名文件夹下的__init__文件 import pymysql
pymysql.install_as_MySQLdb()

 然后呢,我们就需要根据数据库去自动生成新的models文件

python manage.py inspectdb #简单可以看一下自动映射成的models中的内容

导出并且去代替models.py

python manage.py inspectdb > models.py

这样你就会发现在manage.py的同级目录下生成了一个models.py文件

使用这个models.py文件覆盖app中的models文件。

如果完成了以上的操作,生成的是一个不可修改/删除的models,修改meta class中的managed = True则可以去告诉django可以对数据库进行操作

1294578-20180703082631513-1019513692.png

此时,我们再去使models.py和数据库进行同步

python manage.py migrate

这个时候就已经大功告成了!

 然我们来验证一下:

python manage.py shell #一些查询语句

嗯.....没毛病。

标签: python 学习笔记 Django

评论(0) 浏览(500)

Django 数据表资料

2019-11-14 张宇童 Python

表结构

基本结构

models.AutoField  自增列 = int(11)
  如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键     primary_key=True。
models.CharField  字符串字段
  必须 max_length 参数
models.BooleanField  布尔类型=tinyint(1)
  不能为空,Blank=True
models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  继承CharField,所以必须 max_lenght 参数
models.DateField  日期类型 date
  对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
models.DateTimeField  日期类型 datetime
  同DateField的参数
models.Decimal  十进制小数类型 = decimal
  必须指定整数位max_digits和小数位decimal_places
models.EmailField  字符串类型(正则表达式邮箱) =varchar
  对字符串进行正则表达式
models.FloatField  浮点类型 = double
models.IntegerField  整形
models.BigIntegerField  长整形
  integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
models.IPAddressField  字符串类型(ip4正则表达式)
models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipvipv6
  验证时,会根据设置报错
models.NullBooleanField  允许为空的布尔类型
models.PositiveIntegerFiel  正Integer
models.PositiveSmallIntegerField  正smallInteger
models.SlugField  减号、下划线、字母、数字
models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、int、bigint
models.TextField  字符串=longtext
models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
models.URLField  字符串,地址正则表达式
models.BinaryField  二进制
models.ImageField   图片
models.FilePathField 文件

数据字段

null=True
  数据库中字段是否可以为空
blank=True
  django的 Admin 中添加数据时是否可允许空值
primary_key = False
  主键,对AutoField设置主键后,就会代替原来的自增 id 列
auto_now 和 auto_now_add
  auto_now   自动创建---无论添加或修改,都是当前操作的时间
  auto_now_add  自动创建---永远是创建时的时间
choices
    GENDER_CHOICE = (
            (u'M', u'Male'),
            (u'F', u'Female'),
        )
        gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
max_length
default  默认值
verbose_name  Admin中字段的显示名称
name|db_column  数据库中的字段名称
unique=True  不允许重复
db_index = True  数据库索引
editable=True  在Admin里是否可编辑
error_messages=None  错误提示
auto_created=False  自动创建
help_text  在Admin中提示帮助信息
validators=[]
upload-to

连表结构

  • 一对多:models.ForeignKey(其他表)
  • 多对多:models.ManyToManyField(其他表)
  • 一对一:models.OneToOneField(其他表)
应用场景:
    一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
    例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。
    多对多:在某表中创建一行数据是,有一个可以多选的下拉框
    例如:创建用户信息,需要为用户指定多个爱好
    一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了
    例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据

表操作

基本操作

    增
    models.Tb1.objects.create(c1='xx', c2='oo')  增加一条数据,可以接受字典类型数据 **kwargs
    obj = models.Tb1(c1='xx', c2='oo')
    obj.save()

    查

    models.Tb1.objects.get(id=123)         获取单条数据,不存在则报错(不建议)
    models.Tb1.objects.all()               获取全部
    models.Tb1.objects.filter(name='seven') 获取指定条件的数据

    删
    
    models.Tb1.objects.filter(name='seven').delete() 删除指定条件的数据

    改
    models.Tb1.objects.filter(name='seven').update(gender='0')  将指定条件的数据更新,均支持 **kwargs
    obj = models.Tb1.objects.get(id=1)
    obj.c1 = '111'
    obj.save()                                                 修改单条数据

        基本操作

进阶操作(了不起的双下划线)

利用双下划线将字段和对应的操作连接起来

        # 获取个数
    #
    # models.Tb1.objects.filter(name='seven').count()

    # 大于,小于
    #
    # models.Tb1.objects.filter(id__gt=1)              # 获取id大于1的值
    # models.Tb1.objects.filter(id__lt=10)             # 获取id小于10的值
    # models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值

    # in
    #
    # models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于33的数据
    # models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in

    # contains
    #
    # models.Tb1.objects.filter(name__contains="ven")
    # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
    # models.Tb1.objects.exclude(name__icontains="ven")

    # range
    #
    # models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and

    # 其他类似
    #
    # startswith,istartswith, endswith, iendswith,

    # order by
    #
    # models.Tb1.objects.filter(name='seven').order_by('id')    # asc
    # models.Tb1.objects.filter(name='seven').order_by('-id')   # desc

    # limit 、offset
    #
    # models.Tb1.objects.all()[10:20]

    # group by
    from django.db.models import Count, Min, Max, Sum
    # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
    # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

连表操作

表结构实训

class UserProfile(models.Model):
    user_info = models.OneToOneField('UserInfo')
    username = models.CharField(max_length=64)
    password = models.CharField(max_length=64)

    def __unicode__(self):
        return self.username


class UserInfo(models.Model):
    user_type_choice = (
        (0, u'普通用户'),
        (1, u'高级用户'),
    )
    user_type = models.IntegerField(choices=user_type_choice)
    name = models.CharField(max_length=32)
    email = models.CharField(max_length=32)
    address = models.CharField(max_length=128)

    def __unicode__(self):
        return self.name


class UserGroup(models.Model):

    caption = models.CharField(max_length=64)

    user_info = models.ManyToManyField('UserInfo')

    def __unicode__(self):
        return self.caption


class Host(models.Model):
    hostname = models.CharField(max_length=64)
    ip = models.GenericIPAddressField()
    user_group = models.ForeignKey('UserGroup')

    def __unicode__(self):
        return self.hostname

一对一操作

user_info_obj = models.UserInfo.objects.filter(id=1).first()
print user_info_obj.user_type
print user_info_obj.get_user_type_display()
print user_info_obj.userprofile.password
 
user_info_obj = models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first()
print user_info_obj.keys()
print user_info_obj.values()

一对多操作

类似一对一
搜索条件使用 __ 连接
获取值时使用 .    连接

多对多

user_info_obj = models.UserInfo.objects.get(name=u'Tyler')
user_info_objs = models.UserInfo.objects.all()
 
group_obj = models.UserGroup.objects.get(caption='CEO')
group_objs = models.UserGroup.objects.all()
 
# 添加数据
#group_obj.user_info.add(user_info_obj)
#group_obj.user_info.add(*user_info_objs)
 
# 删除数据
#group_obj.user_info.remove(user_info_obj)
#group_obj.user_info.remove(*user_info_objs)
 
# 添加数据
#user_info_obj.usergroup_set.add(group_obj)
#user_info_obj.usergroup_set.add(*group_objs)
 
# 删除数据
#user_info_obj.usergroup_set.remove(group_obj)
#user_info_obj.usergroup_set.remove(*group_objs)
 
# 获取数据
#print group_obj.user_info.all()
#print group_obj.user_info.all().filter(id=1)
 
# 获取数据
#print user_info_obj.usergroup_set.all()
#print user_info_obj.usergroup_set.all().filter(caption='CEO')
#print user_info_obj.usergroup_set.all().filter(caption='DBA')

其他操作

# F 使用查询条件的值
    #
    # from django.db.models import F
    # models.Tb1.objects.update(num=F('num')+1)

    # Q 构建搜索条件
    from django.db.models import Q
    # con = Q()
    #
    # q1 = Q()
    # q1.connector = 'OR'
    # q1.children.append(('id', 1))
    # q1.children.append(('id', 10))
    # q1.children.append(('id', 9))
    #
    # q2 = Q()
    # q2.connector = 'OR'
    # q2.children.append(('c1', 1))
    # q2.children.append(('c1', 10))
    # q2.children.append(('c1', 9))
    #
    # con.add(q1, 'AND')
    # con.add(q2, 'AND')
    #
    # models.Tb1.objects.filter(con)

    #
    # from django.db import connection
    # cursor = connection.cursor()
    # cursor.execute("""SELECT * from tb where name = %s""", ['Lennon'])
    # row = cursor.fetchone()

标签: python 学习笔记 Django

评论(0) 浏览(580)

Django配置数据库很重要的一个步骤

2019-11-14 张宇童 Python

from pymysql import install_as_MySQLdb

install_as_MySQLdb()

标签: python 学习笔记

评论(0) 浏览(413)

Django获取URL

2019-11-5 张宇童 Python

下边代码内容是关于Django获取当前页面URL的代码,应该是对小伙伴有所用。

request.get_full_path()

获取不带参数URL

request.path

获取主机地址

request.get_host()

标签: python 学习笔记 Django

评论(0) 浏览(509)

深入理解Django中间件

2019-11-5 张宇童 Python

一、django生命周期

写中间件之前呢?还是来说说django的生命周期,我再画下图贴上来,比较清楚 1、浏览器向127.0.0.1:8000/index这个url发出一个请求 2、首先网络通信都是基于socket的,那么django一样,通过wsgiref协议来的 3、在socket对来的请求进行一系列处理,将请求带来的数据处理到request对吧 4、然后再走到中间件 5、通过路由层,分发到对应的视图函数, 6、在视图函数中可能会去数据库取数据,到模板层渲染模板好了之后, 7、再通过中间件,再到wsgiref进行处理,返回到浏览器前端

对于模板层,视图层,路由层就十分熟悉不过了,就是多了一个中间件的那一层,
从上面也应该能够知道,前端浏览器来的请求还是我后台django的响应,是不是都要走到中间件那层,
那我们是不是在请求来的时候,先在中间件那里对请求做一些处理,再响应的时候,又做一次处理呢?

20181125185518228044.png

二、中间件

下面就说说怎么自定义一个中间件,那应该怎么去定义呢?
不知道的话,那就是去看看django它的中间件是怎么样的,我们跟着写不就好了?
在settings文件有个MIDDLEWARE的变量,它就是装着中间件的列表
MIDDLEWARE = [ django.middleware.security.SecurityMiddleware, django.contrib.sessions.middleware.SessionMiddleware, django.middleware.common.CommonMiddleware, django.middleware.csrf.CsrfViewMiddleware, django.contrib.auth.middleware.AuthenticationMiddleware, django.contrib.messages.middleware.MessageMiddleware, django.middleware.clickjacking.XFrameOptionsMiddleware,
    ]
里面都是字符串,我应该怎么操作才能看到信息(这里可能有点啰嗦,但我还是要写,你知道可能别人不知道吧)
复制其中的一个元素,将它的格式改为下面这种格式 from django.middleware.clickjacking import XFrameOptionsMiddleware # 没错这就是导包的方法,那请问django它内部是怎么处理这个的呢? # 我猜测,只是猜测,无非就是在最前面加form,最后一个小数点改为import,就和上面不就一样了么。 # 然后你再Ctrl+左击鼠标就能进去看源码了 # 额额,再啰嗦一句,怎么看一个对象的源码,首先你要打印type(对象),在终端复制它的class到文件, # 然后操作和上面就是一样了  你多复制几个django自带的中间件,你就会发现,这其实就是一个类,并且继承了MiddlewareMixin这个类,
该类下面的隐藏方法不用去管,就看其他方法有没有相同之处,(这里你最好是自己去操作一下,这样才有印象)

无非就是下面这几个方法: def process_request(self,request) pass def process_response(self,request,response) pass def process_view(self, request, callback, callback_args, callback_kwargs) pass 看名字就应该能知道是干什么的吧,process_request:不就是处理请求嘛,process_response:处理响应。 # 之前讲到浏览器来的请求,django的响应都会走到中间件,那么上面这么方法是不是也会执行到呢? # 如果可以的话,我就可以在中间件控制请求和响应了

 

三、process_request方法

自定义一个中间件: 1、创建一个py文件,在里面写一个类,继承MiddlewareMixin 2、再到settings里的MIDDLEWARE,添加刚刚创建类 # 注意,1、你别光创建类,然后那么方法就不写了。 2、根据需求写对应的方法,不一定要全部都写。

下面是我写的中间件
zhuyu.py: from django.utils.deprecation import MiddlewareMixin class Test1(MiddlewareMixin): def process_request(self, request): print(test1 request zhuyu) class Test2(MiddlewareMixin): def process_request(self, request): print(test2 request zhuyu)

settings文件中:
MIDDLEWARE = [ django.middleware.security.SecurityMiddleware, django.contrib.sessions.middleware.SessionMiddleware, django.middleware.common.CommonMiddleware, django.middleware.csrf.CsrfViewMiddleware, django.contrib.auth.middleware.AuthenticationMiddleware, django.contrib.messages.middleware.MessageMiddleware, django.middleware.clickjacking.XFrameOptionsMiddleware, zhuyu.Test1, zhuyu.Test2,
    ]

好了,我现在启动项目,并且发一个请求
如果我没有猜错的话,应该会打印我定义的那两句话
结果毋庸置疑:
    test1 request zhuyu
    test2 request zhuyu

我们先看,先打印的是test1,然后才是test2,再去看settings中看看中间件配置
zhuyu.Test1在zhuyu.Test2上方

推断:我们是不是可以判断中间的执行循序是从上到下的呢?

 

四、process_response方法

process_request方法讲了,那在自定义中间中,再添加process_response def process_response(self,request,response): print (test1 response) def process_response(self,request,response): print (test2 response)


这时我们django项目会报错,
错误信息为:NoneType object has no attribute get 先不看这个错误,看看我终端的打印情况

打印情况为: test1 request zhuyu
           test2 request zhuyu
           test2 response
           test1 response
分析:前两行的我们知道原因,那为什么第三,四行却是test2,test1呢?
     难道不是从上往下的顺序?
解答:首先计算机是不会出问题,出现这种情况,我们只能从结果反推测它怎么运行,
     什么时候会走到第三,四行,django处理完数据,响应回前端浏览器,走到中间件,
     先走到zhuyu.Test2,再是zhuyu.Test1,那我们就应该知道些什么了

总结:1、浏览器过来的请求,执行顺序是从上往下,依次执行中间件里的process_request方法 2、后台的响应,执行顺序为从下往上,依次执行process_response方法


再说说那个错误:NoneType object has no attribute get 分析:出现这个错误是我们在给原先的中间件,添加process_response方法,那肯定是方法那里写的有问题
     我们看看那个方法: def process_response(self,request,response): print (test2 response)

    执行该方法的时候,是我们后台已经处理完毕,然后返回到前台浏览器的过程
    那这几个参数代表些什么?
    request:代表request对象,也是前台来的请求对象
    response:这个呢?就是我们视图函数返回的HttpResponse对象,你说是不是,
    这个对象不应该是从中间件走到wsgiref那里进行处理,再到前台吗?
    再看我们的方法,它的返回值是None,所以才会报出上面那个错误

解决方法:让这个方法的返回值是response就好了,return response
思考:这个response就是HttpResponse对象,那我们是不是可以在该方法对这个response进行处理,
     再 return response

跟着上面的总结继续写: 3、如果执行process_response方法,必须返回response这个参数

你是不是有这样的一个疑问?
    为什么我process_request方法,它的返回值是None,为什么不会出错呢?

好吧!这其实是我疑问,为了解决这个疑问,我去看了它的父类MiddlewareMixin
下面是该类的代码: class MiddlewareMixin(object): def __init__(self, get_response=None):
        self.get_response = get_response
        super(MiddlewareMixin, self).__init__() def __call__(self, request):
        response = None if hasattr(self, process_request):
            response = self.process_request(request) if not response:
            response = self.get_response(request) if hasattr(self, process_response):
            response = self.process_response(request, response) return response

看到这段代码我大概知道中间件是怎么去执行的了,(这里我不太确定yy的对不对) 1、首先settings中MIDDLEWARE是一个列表(也就是可迭代的),那应该就是对MIDDLEWARE进行for循环 2、每循环出一个元素,这里是一个字符串,怎么知道到对应的类呢?我猜应该是和上面上个方法一样,对字符串进行修改 3、找到......................................................... 4、这里我卡住了,我知道大概顺序,但是不知道其内部到底怎么运行,难受,其实就是反射,__call__方法,哎,难弄!!! 5、抽空还是用弄清楚。。卡在这里不舒服,知道的话可以邮件我1923790430@qq.com 6、这里1,2的推断失效!

 

五、process_view方法

process_view(self, request, callback, callback_args, callback_kwargs) # 这里的request就是和视图函数的request一样 # callback,该request中的url对应的视图函数 # callback_args, callback_kwargs 该试图函数的有名参数,无名参数 # 你也可以在这里调用,其实没多大的意义 # 继续接着创建的中间件添加该方法,看看执行顺序 process_view(self, request, callback, callback_args, callback_kwargs): print (test1  view)
process_view(self, request, callback, callback_args, callback_kwargs): print (test2  view)

执行看看效果:
        test1 request zhuyu
        test2 request zhuyu
        test1  view
        test2  view
        test2 response
        test1 response
继续测试,我访问127.0.0.1:8000/index,并且在视图函数打印index,再看执行顺序
        test1 request zhuyu
        test2 request zhuyu
        test1  view
        test2  view
        index
        test2 response
        test1 response
基于上面的测试,总结下执行顺序:
process_request----->process_view----->执行视图函数----->process_response

 

六、再看process_request方法

 它的返回值只能是是HttpResponse对象和None,None代表继续走下一个中间件的process_request方法,
    如果是HttpResponse,则会执行当前的process_response方法,相当于跳过了process_view和视图函数那块,
    为什么说只能是HttpResponse对象和None,因为有一层判断,判断process_request的返回值,为真的话,拿着
    该返回值HttpResponse执行process_response方法,因为process_response方法的参数必须为HttpResponse def __call__(self, request):
        response = None if hasattr(self, process_request):
            response = self.process_request(request) if not response:
            response = self.get_response(request) if hasattr(self, process_response):
            response = self.process_response(request, response) return response
    这就是上面的依据,get_response这个方法我猜测一定是一直执行各个中间件的process_request,里面肯定是对象的
    调用,所以才会继续执行这个__call__方法,执行完所有process_request之后,再从最后一个中间件慢慢往上执行
    process_response。

 20181125185518393089.png 20181125185518819863.png

七、process_exception方法

process_exception(self, request, exception)
request这个就不再说了
exception是视图函数异常产生的Exception对象。
这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象
,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个
中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。

 

八、process_template_response

该方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法 class Test: def __init__(self,status,msg):
        self.status=status
        self.msg=msg def render(self): import json
        dic={status:self.status,msg:self.msg} return HttpResponse(json.dumps(dic)) def index(response): return Test(True,测试)

标签: python 学习笔记 Django

评论(0) 浏览(1066)

AttributeError: 'str' object has no attribute 'decode'

2019-10-28 张宇童 Python

python3下列代码会报上边的错

print("Response:", resp.text.decode('unicode_escape'))
解决办法:
print("Response:", resp.text.encode('utf-8').decode('unicode_escape'))
中间加上.encode('utf-8')即可

标签: python 学习笔记

评论(0) 浏览(2741)

Django学习笔记

2019-10-16 张宇童 Python

1.创建项目
  django-admin startproject wen
2.启动
  python3 manage.py runserver  0:8000
3.返回一个字符串
 创建应用
    python3 manage.py startapp home
 在views.py中添加函数
     from django.http import HttpResponse
     def index(request):
         return HttpResponse('')
 修改跟路由
    url(r'^',include('home.urls'))
 新建自路由 在home目录下 urls.py
    from . import views
    url(r'^$',views.index)
4.访问 127.0.0.1:8000
5.返回一个网页
 
  a.在manage.py同级目录下创建templates
  b.修改settings.py dirs:[os.path.join(BASE_DIR,'templates')]
  c.修改应用下的views.py
      def page(request):
         return render(request,'index.html',{'key':数据})
  d.修改子路由
    url(r'^index/$',views.page)
6.路由
   
   从上往下匹配 如果找到符合规则的路由 后面的路由不在进行匹配
   如果一个都没有匹配到  返回404
   位置参数:
     将路由用小括号括起来的内容作为位置参数传递给视图函数   
     url(r'page/([0-9]+)/',views.page)
     def page(request,p):
   命名组:关键字参数
         url(r'page/(?P<x>[0-9]+)/',views.page)
         def page(request,x)

默认值参数:
  定义两个路由指向一个视图函数
        url(r'^users/$',views.users),
        url(r'^users/([0-9]+)/$',views.users)
        def users(request,p=1):
            print(p)
            return HttpResponse('默认值参数')
错误处理:
  修改settings文件 关闭debug
  在templates下创建404.html
反向解析:
  写死:硬编码  
  反向解析: 通过路由的name属性 反向查找路由规则  给路由添加name属性
  在模板中使用  {% url '路由的名子' %}
  如果有参数   {% url '路由的名子' 参数1 参数2 %}
  在视图函数当中使用:
    from django.core.urlresolvers import reverse
    reverse('路由名字')
    reverse('路由名字',args=(参数1,参数2))
模型配置:
  
  1.安装pymysql
  2.修改配置文件
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'stu',#选择数据库的名,请确认你的mysql中有这个库
                'USER': 'root',
                'PASSWORD': 'abc123',
                'HOST': '127.0.0.1',
                'PORT': '3306',
                }
        }
    3.项目同名的目录下的__init__.py
        import pymysql
        pymysql.install_as_MySQLdb()
    4.将应用添加到setting.py
        INSTALLED_APPS = [
            'django.contrib.admin',
            'django.contrib.auth',
            'django.contrib.contenttypes',
            'django.contrib.sessions',
            'django.contrib.messages',
            'django.contrib.staticfiles',
            'home'
        ]

定义模型
  1.找到应用下的models.py
        class users(models.Model):
            # Users   home_users
            name=models.CharField(max_length=20)  # varchar() char() 
            age=models.IntegerField(default=16)
  
  2.生成迁移文件  
    在manage.py 目录下执行
        python3 manage.py makemigrations
        会在应用的migrations目录下生成一个迁移文件
  3.执行迁移
    python3 manage.py migrate

表的命名:
    默认不指定表名 应用名_类名的小写

添加数据:
    from . import models
    res = models.类名()
    res.name=''
    res.age=''
    res.save()
查询数据
   res = models.类名.objects.all()   返回的是一个查询集合
更新数据
   res = models.类名.objects.get(id=)   
   res.name=''
   res.save()
删除:
   res = models.类名.objects.get(id=)   
    
   res.delete()

1.路由的默认值参数
2.反向解析
3.模型的配置
4.定义一个模型
5.使用模型增删改查操作
6.模型的属性
7.字段类型
使用django框架实现用户的管理
首页:所有用户的信息
添加用户:
    接受用户的信息
    
    User
删除用户:
修改用户:
<form action="{% url '' %}" method="GET"></form>


标签: python 学习笔记

评论(2) 浏览(1034)

Django的安装

2019-10-16 张宇童 Python

第一步:

设置pip的配置文件 改为中国

vim ~/.pip/pip.conf


[global]

index-url = https://pypi.tuna.tsinghua.edu.cn/simple

[install]

trusted-host = https://pypi.tuna.tsinghua.edu.cn

第二步:

下载Django

sudo pip3 install django==1.11.*


第三步:

创建项目


django-admin startprobject web



第四步:

启动项目


cd web

python3 manage.py runserver




标签: python 学习笔记 Django

评论(0) 浏览(472)

Python学习笔记之面向对象商店

2019-10-14 张宇童 Python

class Cx():
    zhanghao = ''
    __listvar = {
        'aa':'123123',
        'bb':'321321'
    }
    __login = False
    __countError = 0
    __shopy = [
        (1,'鞋子',100,500),
        (2,'袜子',2,1000)
    ]
    __qian = 1000

    def __init__(self):
        self.__vlidate_zhanghao();
        self.__vlidate_password();
        if not self.__login:
            print('系统错误')
            import sys;
            sys.exit();
        self.__showShopy();
        self.__goumai();


    def __vlidate_zhanghao(self):
        zhanghao = False;
        while not zhanghao:
            name = input('请输入您的账号:').strip();
            if name in self.__listvar:
                zhanghao = True;
                self.zhanghao = name
            if not zhanghao:
                print('对不起账号不存在请重新输入')

    def __vlidate_password(self):
        mima = False;
        while not mima:
            if self.__countError > 2:
                print('对不起您输入错误次数已达上限,系统自动退出')
                import sys;
                sys.exit();
            pwd = input('请输入您的密码:')
            if pwd == self.__listvar[self.zhanghao]:
                mima = True
                print('恭喜登陆成功')
                self.__login = True
            else:
                print('您输入的密码不正确请重新输入')
                self.__countError += 1;

    def __showShopy(self):
        print('商品信息')
        for i in self.__shopy:
            print('序号%d  名称:%s  价格:%d  剩余:%d' % (i[0], i[1], i[2], i[3]))
        print('输入数字 0 离开商店')

    def __goumai(self):
        while True:
            cz = False;
            dd = input('请输入需要购买商品的序号:');
            if dd == '0':
                print('正在送您离开商店。。。')
                import sys;
                print('您已离开商店!')
                sys.exit()
            if (dd == ''):
                print('您的输入有误,请重新输入')
                continue;
            dd = dd.strip()

            for i in self.__shopy:
                if dd == str(i[0]):
                    cz = True
                    temp = i;
            if not cz:
                print('对不起,您输入的序号不正确请重试')
                continue;
            if self.__qian < temp[2]:
                print('对不起,您的余额不足以购买本商品')
                continue;

            self.__qian = self.__qian - temp[2]
            self.__showShopy();
            print('恭喜您购买[%s]成功, 花费[%d] 剩余[%d]' % (temp[1], temp[2], self.__qian))



Cx()

标签: python 学习笔记 练习

评论(0) 浏览(496)

Python学习笔记之面向对象

2019-10-14 张宇童 Python

# 菱形继承
class Original():
    def say(self):
        print('1')
        print('2')
class Man(Original):
    def say(self):
        print('3')
        super().say()
        print('4')
class Woman(Original):
    def say(self):
        print('5')
        super().say()
        print('6')
class Childer(Man, Woman):
    def say(self):
        print('7')
        super().say();
        print('8')
print(Childer.mro())

标签: python 学习笔记 面向对象

评论(0) 浏览(468)

Powered by emlog