码迷,mamicode.com
首页 > 其他好文 > 详细

django orm 数据查询详解

时间:2019-08-13 22:35:28      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:class   auth   查找   下划线   unicode   object   sel   strong   textfield   

 

一 在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))

 

 

 

django orm 数据查询详解

标签:class   auth   查找   下划线   unicode   object   sel   strong   textfield   

原文地址:https://www.cnblogs.com/ZFBG/p/11348917.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!