Python之路-(Django进阶二)

 model:

  双下划线:

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

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

 

  关键字:

        字段的参数:
            null               -> db是否可以为空
            default            -> 默认值
            primary_key        -> 主键
            db_column          -> 列名
            db_index           -> 索引
            unique           -> 唯一索引
            unique_for_date    -> 时间
            unique_for_month   ->月    
            unique_for_year       ->年
            auto_now           -> 创建时,自动生成时间
            auto_now_add       -> 更新时,自动更新为当前时间                
            choices           -> django admin中显示下拉框,避免连表查询
            blank             -> django admin是否可以为空
            verbose_name      -> django admin显示字段中文
            editable          -> django admin是否可以被编辑
            error_messages    -> 错误信息欠
            help_text         -> django admin提示
            validators      -> django form ,自定义错误信息(欠)

 

  外键操作:

    说到外键,我们并不陌生,之前我们学过sqlalchemy,为了减少输入的重复性,下面我们来看看django的外键操作:

    首先,我们要更新我们的数据库,因为是外键所以必须是多个表之间的关系。

    

from django.db import models

# Create your models here.
#外键,用户组织架构信息
class user_group(models.Model):
    #主键
    uid = models.AutoField(primary_key=True)
    caption = models.CharField(max_length=128,db_index=True)



#用户名基本信息
class UserInfo(models.Model):
    username = models.CharField(max_length=32,db_index=True)
    password = models.CharField(max_length=64,db_index=True)
    email = models.EmailField()
    tel = models.IntegerField()
    u_group = models.ForeignKey(to='user_group',to_field='uid') 

  外键的查询

  u_group字段其实是一个query.set类型,也就说u_group.uid和u_group.caption就直接查到了第二张表的这行数据,如果是还有关联(外键),可以继续点。如果不想跨表查询u_group地段的数据名称是u_group_id,默认django加的。

#如上表的示例:
    user_list = models.UserInfo.objects.all()
    for row in user_list:
        print(row.username,row.password,row.email,row.tel,row.u_group.caption,row.u_group.uid)

  多对多:

    创建方式一(自定义关系表):  

            class Host(models.Model):
                nid = models.AutoField(primary_key=True)
                hostname = models.CharField(max_length=32,db_index=True)
                ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
                port = models.IntegerField()
                b = models.ForeignKey(to="Business", to_field='id')
            # 10
            class Application(models.Model):
                name = models.CharField(max_length=32)
            # 2
            
            class HostToApp(models.Model):
                hobj = models.ForeignKey(to='Host',to_field='nid')
                aobj = models.ForeignKey(to='Application',to_field='id')
                
            # HostToApp.objects.create(hobj_id=1,aobj_id=2)

 

    创建方式二(自动创建关系表):

            class Host(models.Model):
                nid = models.AutoField(primary_key=True)
                hostname = models.CharField(max_length=32,db_index=True)
                ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
                port = models.IntegerField()
                b = models.ForeignKey(to="Business", to_field='id')
            # 10
            class Application(models.Model):
                name = models.CharField(max_length=32)
                r = models.ManyToManyField("Host")
                

扩展 

数据库操作的多种方式:  

  增加:
    方式一(常用):models.User.objects.create(name='张三',age=18)
    方式二:dic = {'name': 'xx', 'age': 19}
        models.User.objects.create(**dic)


    方式三:obj = models.User(name='张三',age=18)
        obj.save()
  删除
    models.User.objects.filter(id=1).delete()


  改(id字段大于一)
    方式一:models.User.objects.filter(id__gt=1).update(name='张三',age=22)
    方式二   dic = {'name': 'xx', 'age': 19}
        models.User.objects.filter(id__gt=1).update(**dic)
  查询(gt大于,lt小于,get大于等于,lte小于等于)
    models.User.objects.filter(id=1,name='root')
    models.User.objects.filter(id__gt=1,name='root')
    models.User.objects.filter(id__lt=1)
    models.User.objects.filter(id__gte=1)
    models.User.objects.filter(id__lte=1)

    models.User.objects.filter(id=1,name='root')


    dic = {'name': 'xx', 'age__gt': 19}
    models.User.objects.filter(**dic)


  牢记:
    # QuerySet ,内部元素都是对象。html中for循环后直接点查询字段就行  {{ row.id }} {{ row.caption }}

    v1 = models.Business.objects.all()
    

    value和values_list的好处是根据自己的需求取出字段,而不会将数据库所有数据取出。
    # QuerySet ,内部元素都是字典
    v2 = models.Business.objects.all().values('id','caption')


    # QuerySet ,内部元素都是元组。html中for循环后只能用元祖索引取值比如,{{ row.0 }}  {{ row.1 }}
    v3 = models.Business.objects.all().values_list('id','caption') 

    # 获取到的一个对象,如果不存在就报错
    models.Business.objects.get(id=1)

    可以这么用v4 = models.Business.objects.filter(id=1).first()

    如果没有数据就返回None,不至于程序崩溃


    外键:
    v = models.Host.objects.filter(nid__gt=0)
    v[0].b.caption ----> 通过.进行跨表

  

详解.all和.all.values()及.all.values_list用法  

views:
def test(request):
    v1 = models.UserInfo.objects.all()
    v2 = models.UserInfo.objects.all().values('id','username','user_group__caption')#注意cation是两个下划线
    v3 = models.UserInfo.objects.all().values_list('id','username','user_group__caption')
    for row in v3:
        print(row[0],row[1],row[2])
    return render(request,'test.html',{'v1':v1,'v2':v2,'v3':v3})
test.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <table>
        <tbody>
        <tr>
            <td>点all</td>
        </tr>
        {% for row in v1 %}
            <tr>
                <td>{{ row.id }} </td>
                <td>{{ row.username }} </td>
                <td>{{ row.user_group.caption }} </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
<h1></h1>
    <table>
        <tbody>
        <tr>
            <td>点values</td>
        </tr>
        {% for row in v2 %}
            <tr>
                <td>{{ row.id }} </td>
                <td>{{ row.username }} </td>
                <td>{{ row.user_group__caption }} </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
<h1></h1>
<table>
        <tbody>
        <tr>
            <td>点values_list</td>
        </tr>
        {% for row in v3 %}
            <tr>
                <td>{{ row.0 }} </td>
                <td>{{ row.1 }} </td>
                <td>{{ row.2 }} </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
</div>
</body>
</html>

展示:

 

 

 

  

posted @ 2016-12-21 09:15  Charles.L  阅读(314)  评论(0编辑  收藏  举报