python django基础五 ORM多表操作

首先在创建表的时候看下分析一下

1.作者表和作者详细地址表  一对一关系 理论上谁都能当主表 把Author设置成主表 au=models.OneToOneField(to='AuthorDetail',to_field='id')

主表会多个au列 用于关联

2.书和出版社 一个出版社可以出好多书 一对多关系,哪个表数据多就把关键设置哪个表中 所以publisher=models.ForeignKey(to='Publish',to_field='id',on_delete=models.CASCADE)关联后publisher字段会变成publisher_id,有级联删除deltete

3.书和作者表 多对多关系 理论上谁都能当主表 把book设为主表 authors=models.ManyToManyField(to='Author')这时候会产生第3个表app01_book_authors用于保存书id和作者id的对应的关系

创建表

from django.db import models

#作者表
class Author(models.Model):
    id=models.AutoField(primary_key=True)
    name=models.CharField(max_length=30)
    age=models.IntegerField()
    #AuthorDetail 一对一表 关联
    au=models.OneToOneField(to='AuthorDetail',to_field='id')

#详细地址
class AuthorDetail(models.Model):
    id=models.AutoField(primary_key=True)
    address=models.CharField(max_length=40)
    tel=models.CharField(max_length=20)
#出版社
class Publish(models.Model):
    id=models.AutoField(primary_key=True)
    name=models.CharField(max_length=20)
    addr=models.CharField(max_length=40)
 #
class Book(models.Model):
    id=models.AutoField(primary_key=True)
    title=models.CharField(max_length=20)
    #书和出版社 出版社一对多
    publisher=models.ForeignKey(to='Publish',to_field='id',on_delete=models.CASCADE)
    #多对多 书跟作者
    authors=models.ManyToManyField(to='Author')

python manage.py makemigrations

python manage.py migrate

添加数据

一对一
    先添加地址表
    models.AuthorDetail.objects.create(
        id=2,address='杭州',tel=777
    )

    models.Author.objects.create(
        name='张无忌',age=18,au_id=1
    )

一对多

方法一
pub_obj=models.Publish.objects.filter(id=1)[0]
models.Book.objects.create(title='西游记',publisher=pub_obj)
#publisher是设计字段 publisher_id是生产的
方法二
models.Book.objects.create(
    title='三国演义',
    publisher_id=1
)

多对多

   # 多对多插入
    book_obj = models.Book.objects.get(id=2)
    lzs = models.Author.objects.get(id=2)
    ##第二种方式
    # book_obj.authors.add(*[1,2])
    book_obj.authors.add(2, 2)

查询数据

一对一查询

    ##正向一对一查询
        zuozhe=models.Author.objects.get(name='张无忌')
        print(zuozhe.au.address)#通过 au映射 作者信息 找到地址
    ##反向一对一查询
        fanzuozhe=models.AuthorDetail.objects.get(address='台湾')
        print(fanzuozhe.author.name)#author是作者名称

一对多查询

    # 一对多查询
    shu=models.Book.objects.get(title='三国演义')
    print(shu.publisher.name)#通过书名 publisher正向查询出版社name
    #反向查询
    fanshu=models.Publish.objects.get(name='18期出版')
    print(fanshu.book_set.all().values())

多对多查询

    ##多对多查询
    shu=models.Book.objects.get(title='三国演义')
    print(shu.authors.all().values('name'))
    fanshu=models.Author.objects.get(name='张无忌')
    print(fanshu.book_set.all().values())

猜你喜欢

转载自www.cnblogs.com/zaizai1573/p/10454191.html