zoukankan      html  css  js  c++  java
  • django orm 数据查询详解

     

    一 在django里面创建模型

    from django.db import models
    
    class Blog(models.Model):
        name = models.CharField(max_length=100)
        tagline = models.TextField()
    
        def __str__(self):              # __unicode__ on Python 2
            return self.name
    
    class Author(models.Model):
        name = models.CharField(max_length=200)
        email = models.EmailField()
    
        def __str__(self):              # __unicode__ on Python 2
            return self.name
    
    class Entry(models.Model):
        blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
        headline = models.CharField(max_length=255)
        body_text = models.TextField()
        pub_date = models.DateField()
        mod_date = models.DateField()
        authors = models.ManyToManyField(Author)
        n_comments = models.IntegerField()
        n_pingbacks = models.IntegerField()
        rating = models.IntegerField()
    
        def __str__(self):              # __unicode__ on Python 2
            return self.headline
    

     1.2 数据库里面的结构

      需要注意多对多的中间表

    1.3 创建对象

    from blog.models import Blog

    这里需要注意 一定要对属性的名字写上 另外save方法有括号

     1.3 创建外键对象并保存

    这里需要注意 blog是外键  这里只能赋值给一个外键的对象 或者数字1 2 3 4(代表外键的  对方的ID)

    e.headline="my2 bolg"
    e.body_text="test"
    e.pub_date=datetime.date.today()
    emod_date=datetime.date.today()
    e.n_comments=12
    e.pingbacks=20
    e.eating=10
    e.blog=b   ##这里需要特别注意
    e.save()

     e.blog=1 这种写法存疑

    1.4 多对多

    john = Author.objects.create(name="John")
    paul = Author.objects.create(name="Paul")
    george = Author.objects.create(name="George")
    ringo = Author.objects.create(name="Ringo")
    e.authors.add(john, paul, george, ringo)

    注意这里的对应关系存储在中间表中

     

    二 检索对象

    1.2  这里注意必须用类名  不能使用 对象名!!!

    2.2 过滤

    这里注意 有2个下划线  django的固定语法

    >>> Entry.objects.filter(pub_date__year=2019)

    <QuerySet [<Entry: my1 bolg>, <Entry: my2 bolg>]>

     exclude 排除

     过滤的结果都是列表 可以继续链式过滤

    1.3  上面返回的都是列表 可以用get方法返回单一的值

    这里需要注意 如果查询不到会抛出异常,多余一个也会抛出异常

    1.4 外键关联查询

    >>> from blog.models import Blog,Entry,Author
    >>>
    >>> Entry.objects.filter(blog__name="Beatles Blog1")
    <QuerySet [<Entry: my1 bolg>]>

    这里需要注意 可以通过blog(外键)找到对应的类 然后过滤属性 name="XXX"

     反向关联

    >>> Blog.objects.filter(entry__headline="my1 bolg")
    <QuerySet [<Blog: Beatles Blog1>]>

     这里一定要注意 filter后面的  是  关联的 类 的小写 名称entry!!!!!!!!

    多条件同时反向查询!! 这里一定要注意 返回值是Blog对象  entry只是作为查询的邦族条件

     

     3 F表达式

    例如,为了查找comments数目多于pingbacks数目的Entry,可以构造一个F()对象来引用pingback数目,并在查询中使用该F()对象:

    >>> from django.db.models import F
    >>> Entry.objects.filter(n_comments__gt=F('n_pingbacks'))
     
  • 相关阅读:
    《数据可视化之美》阅读(二)
    《数据可视化之美》阅读
    D3学习之动画和变换
    Java学习之垃圾回收
    程序员思维修炼 --- 读书笔记(二)
    程序员思维修炼 --- 读书笔记(一)
    Java 学习笔记 ------第六章 继承与多态
    Java 学习笔记 ------第五章 对象封装
    Java 学习笔记 ------第四章 认识对象
    (转)synchronized底层实现原理&CAS操作&偏向锁、轻量级锁,重量级锁、自旋锁、自适应自旋锁、锁消除、锁粗化
  • 原文地址:https://www.cnblogs.com/ZFBG/p/11348917.html
Copyright © 2011-2022 走看看