• Django (二) 常用字段及 ORM


    MVC介绍
    
    
    Django生命周期
    
    
    many-to-many
    One-to-many   
    
    
    
    Django常用字段 
    CharFiled  需要有max_length   unique=True(代表不能重名)
    EmailFiled
    URLField
    ManyToManyField(哪个表)  #多对多的关系
    ForeignKey(哪个表)  #一对多的关系
    DateTimeField   #精确到秒或者分
    DateField    #精确到天
    ==
    DurationField
    DecimalField   #小数
    FloatField
    SmallIntegrField
    TextField
    TimeField
    =======常用的属性===
    unique  
    null=True  数据库那里可以为空,默认不能为空。数据库可以为空,前端不行。加上blank=True
    blank=True 前端那里可以为空,限制的是Django admin
    verbose_name=u'中文傻傻'   #把字段在前端用中文显示
    choices  
    db_index   #给字段做索引(不常用)
    editable=False   #Django前端页面某项不能修改,消失了。。。。
    error_messages
    help_text="help.....dddddd....."  #前端告诉用户怎么填,地下出现写的提示
    
    
    =========
    一个表对应一个类
    class Author(models.Model):   #作者表
        first_name = models.CharFiled(max_length=32,unique=True)
        last_name = models.CharFiled(max_length=32)
        class Meta:
            verbose_name_plural = u'作者'   #在Django中的前端把表名用中文显示
        
        def __unicode__(self):  #py3.0的是 __str__
            return 'xxxx'
        
    ======
    python manager.py migrate
    makemigrations    #做检查生成SQL语句
    migrate           #执行
    ==========
    
    前端admin默认不出现准确字段,(出现的是XXX object,
    如果想看到显示的具体是什么,需要在类下写 
    def __unicode__(self):  #py3.0的是 __str__  
        return ""
    =========================================================================
    上面用了Django的admin对数据库进行操作,下面是常用命令的方式
    导入models模块
    默认不配置环境变量是不能导入的,可以用调试模式,如下
    python manager.py shell   #进入调试模式
    
    from app01 import models
     
    models.Author.objects.all()   #查找所有
                          last()  #查找最后
                          
    修改:
    先找到,在修改  改完保存
    a1 = models.Author.objects.last()
    a1.last_name = "xxxxx"
    a1.save()
    创建
    new_author_obj = models.Author(first_name="NewNname",last_name="NewLastName")
    new_author_obj.save()
    第二种创建方式不用在保存一次  直接会保存
    new_author_obj = models.Author.objects.create(first_name="NewNname2",last_name="2NewLastName")
    过滤
    models.Author.objects.filter(last_name="NewLastNname",first_name="NewNname")
    模糊过滤  两个下划线  __contains   大小写忽略 __icontains    id__range=[2,4] 取id的
    models.Author.objects.filter(last_name__contains="NewLastNname")
    批量修改   .update
    models.Author.objects.filter(last_name__icontains="NewLastNname").update(last_name=“hhh”)
    
    连锁查询   order_by
    
    
    查询书有多少个作者
    b1 = models.Book.objects.last() 
    b1.authors
    这个时候返回出现的是一个对象,类似于<xxxxx object at xxxxx>,如果想正常显示,需要加select_related()
    b1.authors.select_related()
    删除
    b1.deleted()
    
    
    
    
    
    
    
     
    
    
    
    
    
    
     
    Django forms
    http://www.cnblogs.com/BeginMan/archive/2013/09/06/3306081.html
    1、特点
    django forms是Django的表单处理库。依赖HttpRequest,它具有如下特点:
    (1)、快速自动生成HTML表单
    (2)、表单数据校验
    (3)、错误信息提示
    (4)、自动转换为python数据格式
    
    Django中的Form一般有两种功能
    1、输入HTML,自动生成前端表单
    2、验证用户输入,验证输入的合法性
    
    使用
    1:单独创建一个forms文件,
    from django import forms
    class BookForm(forms.Form):
        name = forms.CharField(max_length=10)
    	......
    2:在views里把创建的forms返回给前端,  form.is_valid 验证数据    form.cleaned_data  获取干净的数据 去掉html那些没用的
    from app01 import forms
    def book_form(request):
        form = forms.BookForm()   #生成实例
    	return render(request,'app01/book_form.html', {'book_form':form })
    3:然后前端调用 book_form,单独取一个值,就是{{book_form.name}}
    {{book_form}}
    具体事例
    <form action="" method="post">{% csrf_token %}  #建立form表单 做提交用 和 Ajax差不多
        {{book_form}}
        <input type="submit" value = "创建">
    </form>
    
    
    
    
    
    Blog和Entry有外键关联 一对多的反向查询
    class Blog:
        pass
    class Entry:
        blog = modles.ForeignKey(Blog)
    通过Entry获取Blog  name 为XXX的字段
    models.Entry.objects.get(blog__name="xxxx")
    另一种反向关联查询)跟这个出版社相关的书都查出来
    class Publiser(models.Models):
        pass
    class Book(models.Models):
        publiser = models.ForeignKey(Publiser)
    	
    pub_obj = models.Publiser.objects.last()
    print(pub_obj.book_set.select_related())
    
    
    
    
    查询某个字段的值小与某某个字段的值 ORM F语句
    >>> from django.db.models import F
    >>> Entry.objects.filter(n_comments__gt=F('n_pingbacks'))
    
    ORM Q语句 满足第一个and满足第二个,满足第二个的第一个或第二个
    Poll.objects.get(
        Q(question__startswith='Who'),
        Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
    )
    
    统一自增
    models.Entry.objects.update(n_pingbacks=F('n_pingbacks')+1)
    
    
    表内分类聚合  values_list  annotate分类统计(分类统计各项资产服务器、网络设备各有多少台)
    models.Book.objects.values_list('publish_date').annotate(Count('publish_date'))
    
    
    
    
    
    
    OneToOneField和ForeignKey的区别
    一对一和一对多
    
    
    
    
    Djanog admin内显示中文
    class Meta:
        verbose_name = u'班级列表'
    	verbose_name_plural = u'班级列表'    #复数形式
    	unqiue_together = ('course','course_type','semester')   #联合为一
    	
    	
    	
    	
    	
    在自己的脚本里调用 Django models
    加上环境变量就ok了
    import os
    os.environ['DJANGO_SETTINGS_MODULE'] = 's12day16.settiongs'     #s12day16 是你的setting所在的项目名
    import django
    django.setup()
    form blog import models
    entry = models.Entry.objects.get(pk=1)
    print(entry)
    

     

    Django用户认证系统
    扩展 Django用户认证系统 先继承 在扩展
    from django.contrib.auth.models import User
    
    class UserProfile(models.Model):    
        user = models.OneToOneField(User)     #通过一对一的方式 引用 Django的用户认证系统,然后下面的去扩展name  school......
    	name = models.CharField(max_length=64)
    	school = models.ForeignKey('School')
    	
    	
    	
    	
    Django中构建表结构 自己关联自己,见例子第一个视频35分钟处。
    models.ForeignKey('self' ,blank = True,null = true)    #自己的这个表还没创建,所以就要用引号括起来
    
    
    让字段在admin上显示中文   verbose_name = u'汉字'
    consultant = models.ForeignKey('UserProfile',verbose_name=u'汉字')
    或者
    date = models.DateField(u'汉字',auto_now_add = True)    #把u‘汉字’放到前面
    
    
    
    Django中引用Bootstrap
    1修改url,在主的URL下的跳转到单独项目上自己控制
    url(r'^crm/', include('crm.urls')
    2子项目里添加url文件,定义views文件的逻辑关系
    url(r'^$',views,dashboard)
    新建statics目录,下载Bootstrap添加进去
    3修改 settings文件,添加如下:
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,"static")
    	#'/var/www/static/'    #可以写很多个从第一个开始找,直到最后
    ]
    4前端文件 引用  /static/bootstrap/css/....
    static而不是statics  这样就无需关系 statics目录修改后在去找前端一个个的修改
    

      

  • 相关阅读:
    选择排序法
    计算大阶乘(值很大)
    递归计算阶乘
    计算m的m次方倒数的和
    使用文件(FILE)输入输出
    判断回文数
    最小公倍数(调用函数与全局变量)
    How to 共用体
    How to 枚举
    有效编写软件的75条建议(转)
  • 原文地址:https://www.cnblogs.com/dribs/p/5920246.html
Copyright © 2020-2023  润新知