三种关系:一对多、多对多、多对一
注意:
- 一对多关系中,外键只能在多表
 - 一对一关系中,外键在哪张表无要求,建议放在表数据较少的那张表
 - 多对多关系中,外键在哪张表无要求,因为会创建一张新表存储外键关系
准备模型类
```python from django.db import models 
Create your models here.
from django.db import models
‘’’ Book —— Publish 一对多 Author —— AuthorDetail 一对一 Author —— Book 多对多 ‘’’
class Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField()
# 一对一authordetail = models.OneToOneField(to="AuthorDetail", to_field="nid", on_delete=models.CASCADE)def __str__(self):return self.name
作者详情表
class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True) birthday = models.DateField() telephone = models.BigIntegerField() addr = models.CharField(max_length=64)
出版社表
class Publish(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.EmailField()
def __str__(self):return self.name
class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=32) publishDate = models.DateField() price = models.DecimalField(max_digits=5, decimal_places=2)
# 一对多关系(必须放这张表)publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE, )'''publish_id INT ,FOREIGN KEY (publish_id) REFERENCES publish(id)'''# 多对多authors = models.ManyToManyField(to="Author") # 放在哪个表都行'''CREATE TABLE book_authors(id INT PRIMARY KEY auto_increment ,book_id INT ,author_id INT ,FOREIGN KEY (book_id) REFERENCES book(id),FOREIGN KEY (author_id) REFERENCES author(id))'''# class Book2Author(models.Model):## nid = models.AutoField(primary_key=True)# book=models.ForeignKey(to="Book")# author=models.ForeignKey(to="Author")def __str__(self):return self.title
<a name="rEyev"></a>## 生成的表<br /><br /><br /><br /><br /><a name="K8Grp"></a>## 添加记录<a name="RQbKH"></a>### 表的添加顺序先添加没有外键的表```pythonpub = Publish.objects.create(name="人民出版社", email="598779784@qq.com", city="北京")
一对多关系添加记录
######################绑定一对多的关系###############################################方式1:#为book表绑定出版社: book --- publishbook_obj=Book.objects.create(title="红楼梦",price=100,publishDate="2012-12-12",publish_id=1)print(book_obj.title)#方式2:pub_obj=Publish.objects.filter(nid=1).first()# publish=pub_obj :会自动翻译成publish_id=1book_obj=Book.objects.create(title="三国演绎",price=100,publishDate="2012-12-12",publish=pub_obj)print(book_obj.title)print(book_obj.price)print(book_obj.publishDate)print(book_obj.publish) # 与这本书籍关联的出版社对象print(book_obj.publish.name)print(book_obj.publish.email)print(book_obj.publish_id)#查询西游记的出版社对应的邮箱book_obj=Book.objects.filter(title="西游记").first()print(book_obj.publish.email)
多对多关系添加
######################绑定多对多的关系##############################################book_obj=Book.objects.create(title="金瓶梅",price=100,publishDate="2012-12-12",publish_id=1)egon=Author.objects.get(name="egon")ecithy=Author.objects.get(name="ecithy")#绑定多对多关系的APIbook_obj.authors.add(egon,ecithy) # 通过book_obj、authors找到表book_authors,将egon、ecithy的id取出来放进去book_obj.authors.add(1,2,3)book_obj.authors.add(*[1,2,3])#解除多对多关系book=Book.objects.filter(nid=4).first()book.authors.remove(2) # author_id = 2#book.authors.remove(*[1,2]) # author_id = 1和2book.authors.clear()#查询主键为4的书籍的所有作者的名字book=Book.objects.filter(nid=4).first()print(book.authors.all()) # [obj1,obj2...] queryset: 与这本书关联的所有作者对象集合ret=book.authors.all().values("name")print(ret)
