标签:级联 foreign pytho tail model object one integer 创建
首先在创建表的时候看下分析一下
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())
标签:级联 foreign pytho tail model object one integer 创建
原文地址:https://www.cnblogs.com/zaizai1573/p/10454191.html