Django Mysql数据库-基于双下划线的跨表查询详解编程语言

一、基于双下划线的跨表查询

Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系。要做跨关系查询,就使用两个下划线来链接模型(model)间关联字段的名称,直到最终链接到你想要的 model 为止。(相当于用sql语句用join连接的方式,可以在settings里面设置,可查看sql语句)

数据库模型:

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")  #建立的一对一的关系

一对多查询:

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、查询linux这本书的出版社的地址:filer先过滤,,values显示要求的字段

    第一种查法 
    ret = models.Book.objects.filter(title="linux").values("publish__addr") // 正向查询时,外键字段__关联表的字段,例如:publish__addr 
    print(ret) 
    第二种查法 
    ret2 = models.Publish.objects.filter(book__title="linux").values("addr") // 反向查询时,表名__字段,例如:book__title 
    print(ret2)

多对多查询:

1、查询egon出过的所有书的名字

#方式一     
    ret = models.Author.objects.filter(name="egon").values("book__title") // 反向查询时,表名__字段 
    print(ret) 
#方式二:两种方式也就是逻辑不一样 
    ret2 = models.Book.objects.filter(authorlist__name="egon").values("title") // 正向查询时,外键字段__字段 
    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)

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/18154.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论