zoukankan      html  css  js  c++  java
  • Django的Orm操作数据库

    Django的Orm操作数据库

    双下划线的跨表查询

    数据库模型

    class Book(models.Model):
        nid = models.AutoField(primary_key=True)  # 自增id(可以不写,默认会有自增id)
        title = models.CharField(max_length=32)
        publishDdata = models.DateField()  # 出版日期
        price = models.DecimalField(max_digits=5, decimal_places=2)  # 一共5位,保留两位小数
    
        #一个出版社有多本书,关联字段要写在多的一方
        # 不用命名为publish_id,因为django为我们自动就加上了_id
        publish = models.ForeignKey("Publish")  #foreignkey(表名)建立的一对多关系
        # publish是实例对象关联的出版社对象
        authorlist = models.ManyToManyField("Author")  #建立的多对多的关系
        def __str__(self):  #__str__方法使用来吧对象转换成字符串的,你返回啥内容就打印啥
            return self.title
    class Publish(models.Model):
        #不写id的时候数据库会自动给你增加自增id
        name =models.CharField(max_length=32)
        addr = models.CharField(max_length=32)
    
        def __str__(self):
            return self.name
    class Author(models.Model):
        name = models.CharField(max_length=32)
        age = models.IntegerField()
    
    class AuthorDeital(models.Model):
        tel = models.IntegerField()
        addr = models.CharField(max_length=32)
        author = models.OneToOneField("Author")  #建立的一对一的关系
    

    跨表查询需要使用两个下划线来链接(model)间关联字段的名称,直到最终连接到你想要的model为止。这个相当于mysql的sql语句用join链接一样,可以在django的settings中设置。

    一对多查询

    1.查询人民出版社出版过的所有的书的价格和名字

    # 基于双下划线的方式查询1================一对多
        # 第一种查法
        ret = models.Publish.objects.filter(name="人民出版社").values("book__price","book__title") // 反向查询时,表名__字段,例如:book__price
        print(ret)
        # 第二种查法
        ret2 = models.Book.objects.filter(publish__name="人民出版社").values("price","title")     // 正向查询时,外键字段__关联表的字段,例如:publish__name
        print(ret2)
    

    2.查询手机号以151开头的作者出版过的所有书的名称以及出版社的名称

     # 方式一:
        author_obj = models.AuthorDeital.objects.filter(tel__startswith="151").first()
        print(author_obj.author.book_set.all().values("title","publish__name"))
        # 方式二:
        ret = models.Book.objects.filter(authorlist__author_deital__tel__startswith="151").values("title","publish__name")
        print(ret)
    
  • 相关阅读:
    如何在没鼠标没网络的情况下如何安装驱动以及日常的操作
    开启平行眼的一些小技巧
    go-redis连接
    奶牛议会
    转载(int.TryParse用法)用于对字符串内容进行判断
    Javascript扩展Date的prototype实现时间format函数
    dsu on tree学习笔记
    DP做题笔记
    期望概率做题笔记
    生成函数做题笔记
  • 原文地址:https://www.cnblogs.com/Python-368/p/13200869.html
Copyright © 2011-2022 走看看