django 表操作

添加表纪录

# Create your models here.
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    state = models.BooleanField()
    pub_date = models.DateField()
    price = models.DecimalField(max_digits=8,decimal_places=2)
    publish = models.CharField(max_length=32)

方式1

    book_obj = models.Book(title=python web,price=29,publish=北京出版社,pub_date="2012-12-12")
    book_obj.save()

方式2

  book_obj = models.Book.objects.create(title="java红宝书",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")

删除表纪录

删除方法就是 delete()。它运行时立即删除对象而不返回任何值。例如:

model_obj.delete()

 按条件删除

 ret = models.Book.objects.all().filter(price__in=[100,88]).delete()

 级联删除

在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。例如:

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

delete

b = Blog.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()

要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:

Entry.objects.all().delete()  

如果不想级联删除,可以设置为:

blog = models.ForeignKey(Blog,on_delete=models.SET_NULL,blank=True,null=True)

删除语句

Blog.objects.all().filter(name=‘python_qq‘).delete()

分享图片

修改表纪录

Book.objects.filter(title__startswith="py").update(price=120)

 update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。

 

查询表记录

查询API

1> all():                  查询所有结果
  
<2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象
  
<3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
                            如果符合筛选条件的对象超过一个或者没有都会抛出错误。
  
<4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
 
<5> order_by(*field):       对查询结果排序
  
<6> reverse():              对查询结果反向排序
  
<8> count():                返回数据库中匹配查询(QuerySet)的对象数量。
  
<9> first():                返回第一条记录
  
<10> last():                返回最后一条记录
  
<11> exists():              如果QuerySet包含数据,就返回True,否则返回False
 
<12> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                            model的实例化对象,而是一个可迭代的字典序列
<13> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
 
<14> distinct():            从返回结果中剔除重复纪录

基于双下划线的模糊查询  

Book.objects.filter(price__in=[100,200,300])
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__range=[100,200])
Book.objects.filter(title__contains="python")
Book.objects.filter(title__icontains="python")
Book.objects.filter(title__startswith="py")
Book.objects.filter(pub_date__year=2012)
Entry.objects.get(headline__contains=‘Lennon‘)

contains:

表示包含的意思!大小写敏感!

icontains:

contains的大小写不敏感模式。

startswith和endswith

以什么开头和以什么结尾。大小写敏感!

istartswith和iendswith

是不区分大小写的模式。

查询操作练习

    # 1
    # 查询老男孩出版社出版过的价格大于200的书籍

    book_list = models.Book.objects.filter(price__gt=200,publish=‘老男孩出版社‘)
    print(book_list)
    # 2
    # 查询2017年8月出版的所有以py开头的书籍名称
    book_list = models.Book.objects.filter(title__startswith=‘py‘,pub_date__year=2017,pub_date__month=8)
    print(book_list)
    # 3
    # 查询价格为50,100
    # 或者150的所有书籍名称及其出版社名称
    book_list = models.Book.objects.filter(price__in=[50,100,150]).values_list(‘publish‘,‘title‘)
    print(book_list)
    # 4
    # 查询价格在100到200之间的所有书籍名称及其价格
    book_list = models.Book.objects.filter(price__range=[100,200]).values_list(‘title‘,‘price‘)
    print(book_list)
    # 5
    # 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
    book_list = models.Book.objects.filter(publish=‘人民出版社‘).values_list(‘price‘).distinct().order_by(‘-price‘)
    print(book_list)

  

多表操作

class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    age=models.IntegerField()

    # 与AuthorDetail建立一对一的关系
    authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)


class AuthorDetail(models.Model):

    nid = models.AutoField(primary_key=True)
    birthday=models.DateField()
    telephone=models.BigIntegerField()
    addr=models.CharField( max_length=64)

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    city=models.CharField( max_length=32)
    email=models.EmailField()


class Book(models.Model):

    nid = models.AutoField(primary_key=True)
    title = models.CharField( max_length=32)
    publishDate=models.DateField()
    price=models.DecimalField(max_digits=5,decimal_places=2)

    # 与Publish建立一对多的关系,外键字段建立在多的一方
    publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)
    # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
    authors=models.ManyToManyField(to=Author,)

 

多对多添加方式

    book_obj = Book.objects.filter(nid=1).first()
    alex = Author.objects.create(name=alex,age=20,authorDetail_id=1)
    egon = Author.objects.create(name=egon,age=18,authorDetail_id=2)
    #
    # # 多对多添加方式
    book_obj.authors.add(alex,egon)

跨表查询

 # 1.基于对象的查询(子查询)
    """
    A-B
    关联属性在A表

    正向查询 A---------B
    反向查询 B---------A
    """
    """
    一对多
    """

    # 正向查询查字段
    # 查询书名为红楼梦的出版社名字
    book_obj = Book.objects.filter(title=红楼梦).first()
    print(book_obj.publish.name)  # 查询关联的出版社对象

    # 反向查询查表名_set.all
    # 查询书名为人民出版社的书名
    publish_obj = Publish.objects.filter(name=人民出版社).first()
    print(publish_obj.book_set.all())

    """
    多对多

    """
    # 正向查询查字段
    # 查询书名为红楼梦的作者名字
    book_obj = Book.objects.filter(title=红楼梦).first()
    print(book_obj.authors.all())  # 查询关联的作者对象

    # 反向查询查表名_set.all
    # 查询alex写的书名
    author_obj = Author.objects.filter(name=alex).first()
    print(author_obj.book_set.all())

    """
    一对一查询
    """
    """
    A - B
    关联属性在A表

    正向查询
    A - --------B
    反向查询
    B - --------A

     """

    # 正向查询查字段
    # 查询alex作者电话
    author_obj = Author.objects.filter(name=alex).first()
    print(author_obj.authorDetail.telephone)  # 查询关联的作者细节对象

    # 反向查询查表名
    # 查询电话111的作者
    authorDetail_obj = AuthorDetail.objects.filter(telephone=111).first()
    print(authorDetail_obj.author.name,authorDetail_obj.author.age)

 

 # 2.基于双下划线的查询(join)
    # 正向查询查字段,反向查询查表名告诉orm join

    # 查询书名为红楼梦的出版社名字(一对多)
    """
    sql:
    select app3_publish.name from app3_book inner join app3_publish
    on app3_book.publish_id = app3_publish.nid where app3_book.title=‘红楼梦‘

    """
    # 方式一
    # <QuerySet [{‘publish__name‘: ‘人民出版社‘}]>
    print(Book.objects.filter(title=‘红楼梦‘).values("publish__name"))

    # 方式二
    print(Publish.objects.filter(book__title=‘红楼梦‘).values(
        "name"))  # <QuerySet [{‘publish__name‘: ‘人民出版社‘}]>

    # 查询书名为红楼梦的作者名字(多对多)
    """
    sql:
    select name from app3_author inner join app3_book_authors on app3_author.nid = app3_book_authors.author_id
    inner join app3_book on app3_book.nid = app3_book_authors.book_id
    """
    # 方式一
    # <QuerySet [{‘authors__name‘: ‘alex,egon‘}]>
    print(Book.objects.filter(title=‘红楼梦‘).values("authors__name"))

    # 方式二
    print(Author.objects.filter(book__title=‘红楼梦‘).values("name"))

    # 查询alex作者电话
    print(Author.objects.filter(name=‘alex‘).values("authorDetail__telephone"))

    print(AuthorDetail.objects.filter(author__name=‘alex‘).values("telephone"))

    # 进阶练习
    # 查询电话111作者出版过所有书籍及书籍出版社的名称

    # 方式1
    print(
        Book.objects.filter(
            authors__authorDetail__telephone__startswith=‘11‘).values(
            "title","publish__name"))

    # 方式2
    print(
        Author.objects.filter(
            authorDetail__telephone__startswith=‘11‘).values(
            "book__title","book__publish__name"))

  

聚合查询

from django.db.models import Count,Max,Min,Avg

    print(
        Book.objects.all().aggregate(
            avg_price=Avg("price"),max_price=Max(price),min_price=Min(price)))  # 返回字典

    # 单表分组查询
    # 查询每一个省以及对应的员工数

    # emp:
    print(Emp.objects.values("province").annotate(cnt=Count("id")))

    # 多表分组查询
    # 查询出版社的名称及出版书籍的个数
    ret = Publish.objects.values("nid").annotate(cnt=Count("book__title"))
    print(ret)

    ret = Publish.objects.values("name").annotate(cnt=Count("book__title"))
    print(ret)

    ret = Publish.objects.values("name").annotate(
        cnt=Count("book__title")).values(
        "name","cnt")
    print(ret)

    # 查询每一个作者的名字以及出版书籍的最高价格
    ret = Author.objects.values("pk").annotate(
        max_price=Max("book__price")).values(
        "name","max_price")
    print(ret)

    # 查询每一个书籍的名称及对应的作者个数
    ret = Book.objects.values("pk").annotate(
        cnt=Count("authors__nid")).values(
        "title","cnt")
    print(ret)

    # 统计每一本以py开头的书籍的作者个数:
    ret = Book.objects.filter(
        title__startswith="py").values("pk").annotate(
        cnt=Count("authors__nid")).values(
            "title","cnt")
    print(ret)

    # (4)统计不止一个作者的图书
    ret = Book.objects.values("pk").annotate(
        cnt=Count("authors__nid")).filter(
        cnt__gt=1).values(
            "title","cnt")
    print(ret)

    # F查询Q查询
    from django.db.models import F,Q
    # 统计书的评论数大于读过数
    ret = Book.objects.filter(comment_num__lt=F("read_num"))
    print(ret)

    Book.objects.all().update(price=F("price") + 10)

    ret = Book.objects.filter(Q(title=红楼梦) | Q(price__gt=100))
    print(ret)

    ret = Book.objects.filter(~Q(title=红楼梦) | Q(price__gt=100))
    print(ret)

 

操作API

get() 获取单个对象
create() 创建对象,无需save()
get_or_create() 查询对象,如果没有找到就新建对象
update_or_create() 更新对象,如果没有找到就创建对象
bulk_create() 批量创建对象
count() 统计对象的个数
in_bulk() 根据主键值的列表,批量返回对象
iterator() 获取包含对象的迭代器
latest() 获取最近的对象
earliest() 获取最早的对象
first() 获取第一个对象
last() 获取最后一个对象
aggregate() 聚合操作
exists() 判断queryset中是否有对象
update() 批量更新对象
delete() 批量删除对象

 

 get()

get(**kwargs)

返回按照查询参数匹配到的单个对象,参数的格式应该符合Field lookups的要求。

如果匹配到的对象个数不只一个的话,触发MultipleObjectsReturned异常

如果根据给出的参数匹配不到对象的话,触发DoesNotExist异常。例如:

 

bulk_create()

bulk_create(objs,batch_size=None)

以高效的方式(通常只有1个查询,无论有多少对象)将提供的对象列表插入到数据库中:

Entry.objects.bulk_create([
...     Entry(headline=‘This is a test‘),...     Entry(headline=‘This is only a test‘),... ])

注意事项:

  • 不会调用模型的save()方法,并且不会发送pre_savepost_save信号。
  • 不适用于多表继承场景中的子模型。
  • 如果模型的主键是AutoField,则不会像save()那样检索并设置主键属性,除非数据库后端支持。
  • 不适用于多对多关系。

batch_size参数控制在单个查询中创建的对象数。

 

count()

返回在数据库中对应的QuerySet对象的个数。count()永远不会引发异常。

 

latest(field_name=None)

使用日期字段field_name,按日期返回最新对象。

下例根据Entry的‘pub_date‘字段返回最新发布的entry:

Entry.objects.latest(‘pub_date‘)

exists()

如果QuerySet包含任何结果,则返回True,否则返回False。

查找具有唯一性字段(例如primary_key)的模型是否在一个QuerySet中的最高效的方法是:

entry = Entry.objects.get(pk=123)
if some_queryset.filter(pk=entry.pk).exists():
    print("Entry contained in queryset")

它将比下面的方法快很多,这个方法要求对QuerySet求值并迭代整个QuerySet:

if entry in some_queryset:
   print("Entry contained in QuerySet")

若要查找一个QuerySet是否包含任何元素:

if some_queryset.exists():
    print("There is at least one object in some_queryset")

将快于:

if some_queryset:
    print("There is at least one object in some_queryset")

查询参数及聚合函数

http://www.liujiangblog.com/course/django/132

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用OpenCV实现视频去抖 整体步骤: 设置输入输出视频 寻找帧之间的移动:使用opencv的特征检测器,检测前一帧的特征,并使用Lucas-Kanade光流算法在下一帧跟踪这些特征,根据两组点,将前一个坐标系映射到当前坐标系完成刚性(欧几里得)变换,最后使用数组纪录帧之间的运动。 计算帧之间的平
前言 对中文标题使用余弦相似度算法和编辑距离相似度分析进行相似度分析。 准备数据集part1 本次使用的数据集来源于前几年的硕士学位论文,可根据实际需要更换。结构如下所示: 学位论文题名 基于卷积神经网络的人脸识别研究 P2P流媒体视频点播系统设计和研究 校园网安全体系的设计与实现 无线传感器网络中
前言 之前尝试写过一个爬虫,那时对网页请求还不够熟练,用的原理是:爬取整个html文件,然后根据标签页筛选有效信息。 现在看来这种方式无疑是吃力不讨好,因此现在重新写了一个爬取天气的程序。 准备工作 网上能轻松找到的是 101010100 北京这种编号,而查看中国气象局URL,他们使用的是北京545
前言 本文使用Python实现了PCA算法,并使用ORL人脸数据集进行了测试并输出特征脸,简单实现了人脸识别的功能。 1. 准备 ORL人脸数据集共包含40个不同人的400张图像,是在1992年4月至1994年4月期间由英国剑桥的Olivetti研究实验室创建。此数据集包含40个类,每个类含10张图
前言 使用opencv对图像进行操作,要求:(1)定位银行票据的四条边,然后旋正。(2)根据版面分析,分割出小写金额区域。 图像校正 首先是对图像的校正 读取图片 对图片二值化 进行边缘检测 对边缘的进行霍夫曼变换 将变换结果从极坐标空间投影到笛卡尔坐标得到倾斜角 根据倾斜角对主体校正 import
天气预报API 功能 从中国天气网抓取数据返回1-7天的天气数据,包括: 日期 天气 温度 风力 风向 def get_weather(city): 入参: 城市名,type为字符串,如西安、北京,因为数据引用中国气象网,因此只支持中国城市 返回: 1、列表,包括1-7的天气数据,每一天的分别为一个
数据来源:House Prices - Advanced Regression Techniques 参考文献: Comprehensive data exploration with Python 1. 导入数据 import pandas as pd import warnings warnin
同步和异步 同步和异步是指程序的执行方式。在同步执行中,程序会按顺序一个接一个地执行任务,直到当前任务完成。而在异步执行中,程序会在等待当前任务完成的同时,执行其他任务。 同步执行意味着程序会阻塞,等待任务完成,而异步执行则意味着程序不会阻塞,可以同时执行多个任务。 同步和异步的选择取决于你的程序需
实现代码 import time import pydirectinput import keyboard if __name__ == &#39;__main__&#39;: revolve = False while True: time.sleep(0.1) if keyboard.is_pr
本文从多个角度分析了vi编辑器保存退出命令。我们介绍了保存和退出vi编辑器的命令,以及如何撤销更改、移动光标、查找和替换文本等实用命令。希望这些技巧能帮助你更好地使用vi编辑器。
Python中的回车和换行是计算机中文本处理中的两个重要概念,它们在代码编写中扮演着非常重要的角色。本文从多个角度分析了Python中的回车和换行,包括回车和换行的概念、使用方法、使用场景和注意事项。通过本文的介绍,读者可以更好地理解和掌握Python中的回车和换行,从而编写出更加高效和规范的Python代码。
SQL Server启动不了错误1067是一种比较常见的故障,主要原因是数据库服务启动失败、权限不足和数据库文件损坏等。要解决这个问题,我们需要检查服务日志、重启服务器、检查文件权限和恢复数据库文件等。在日常的数据库运维工作中,我们应该时刻关注数据库的运行状况,及时发现并解决问题,以确保数据库的正常运行。
信息模块是一种可重复使用的、可编程的、可扩展的、可维护的、可测试的、可重构的软件组件。信息模块的端接需要从接口设计、数据格式、消息传递、函数调用等方面进行考虑。信息模块的端接需要满足高内聚、低耦合的原则,以保证系统的可扩展性和可维护性。
本文从电脑配置、PyCharm版本、Java版本、配置文件以及程序冲突等多个角度分析了Win10启动不了PyCharm的可能原因,并提供了解决方法。
本文主要从多个角度分析了安装SQL Server 2012时可能出现的错误,并提供了解决方法。
Pycharm是一款非常优秀的Python集成开发环境,它可以让Python开发者更加高效地进行代码编写、调试和测试。在Pycharm中设置解释器非常简单,我们可以通过创建新项目、修改项目解释器、设置全局解释器等多种方式进行设置。
Python中有多种方法可以将字符串转换为整数,包括使用int()函数、try-except语句、正则表达式、map()函数、ord()函数和reduce()函数。在实际应用中,应根据具体情况选择最合适的方法。
本文介绍了导入CSV文件的多种方法,包括使用Excel、Python和R等工具。同时,还介绍了导入CSV文件时需要注意的一些细节和问题。CSV文件是数据处理和分析中不可或缺的一部分,希望本文能够对读者有所帮助。
mongodb是一种新型的数据库,它采用了面向文档的数据模型,具有灵活性、高性能和高可用性等优势。但是,mongodb也存在数据结构混乱、安全性和学习成本高等问题。
当Python运行不了时,我们应该从代码、Python环境、操作系统和硬件设备等多个角度来排查问题,并采取相应的解决措施。