ORM数据库查询操作之基于双下划线的跨表查询

 创建表结构

from django.db import models


class Book(models.Model):
    title=models.CharField(max_length=32)
    publishDate=models.DateField()
    price=models.DecimalField(max_digits=5,decimal_places=2)

    # 出版社可以发布多部书(一对多)
    publish=models.ForeignKey('Publish')


    # 一个人可以写多本书,一本书也可以由多个人撰写(多对多)
    authorList=models.ManyToManyField('Author')

class Author(models.Model):
    name=models.CharField(max_length=32)
    age=models.IntegerField()
    addr=models.CharField(max_length=32)
    tel=models.CharField(max_length=13)

class Publish(models.Model):
    name=models.CharField(max_length=32)
    addr=models.CharField(max_length=32)

2 urls配置

 

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^index/', views.index),
]

 

5 测试数据

作者数据

出版社数据

 

 

书籍数据

4 编写views代码 

def index(request):
    bookobj = models.Book.objects.all()
    # 练习1:  查询人民出版社出版过的所有书籍的名字与价格(一对多)
    # ret = models.Book.objects.filter(publish__name='山西出版社').values_list('title')
    # ret = models.Publish.objects.filter(name='山西出版社').values_list('book__title','book__authorList__name')
    # ret = models.Author.objects.filter(book__publish__name='山西出版社').values_list('book__title')
    # 练习2: 查询egon出过的所有书籍的名字(多对多)
    # ret = models.Book.objects.filter(authorList__name='alex').values_list('title')
    # ret =models.Author.objects.filter(name='alex').values_list('book__title')
    # 练习3: 查询人民出版社出版过的所有书籍的名字以及作者的姓名
    # ret = models.Publish.objects.filter(name='机械先驱出版社').values_list('book__title','book__authorList__name')
    # ret = models.Book.objects.filter(publish__name='机械先驱出版社').values_list('title','authorList__name')
    # ret = models.Author.objects.filter(book__publish__name='机械先驱出版社').values_list('book__title','name')
    # 练习4: 手机号以151开头的作者出版过的所有书籍名称以及出版社名称
    # ret = models.Author.objects.filter(tel__startswith='158').values_list('book__title','book__publish__name')
    # ret =models.Publish.objects.filter(book__authorList__tel__startswith='158').values_list('book__title','name')
    # ret = models.Book.objects.filter(authorList__tel__startswith='158').values_list('publish__name','title')
    # print(ret)
 	return HttpResponse('OK')

  

 

posted @ 2017-10-30 19:36  Pythia丶陌乐  阅读(539)  评论(0编辑  收藏  举报