标签:3.2 复杂 场景 net djang div tom opened set
在实际生产过程多,我们面对的数据纷繁复杂,此时就需要良好的数据结构设计,多表之间的约束关系为我们提供了数据管理以及查询的便利。在MYsql中我们利用外键(foreign key)来实现这样的约束关系,在django中我们通过调用相应的API来实现这样的功能。
实例:我们来假定下面这些概念,字段和关系
模型建立的代码(module)如下:
1 from django.db import models 2 # Create your models here. 3 4 class Author(models.Model): 5 nid = models.AutoField(primary_key=True) 6 name=models.CharField( max_length=32) 7 age=models.IntegerField() 8 9 # 与AuthorDetail建立一对一的关系 10 authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE) 11 12 class AuthorDetail(models.Model): 13 14 nid = models.AutoField(primary_key=True) 15 birthday=models.DateField() 16 telephone=models.BigIntegerField() 17 addr=models.CharField( max_length=64) 18 19 class Publish(models.Model): 20 nid = models.AutoField(primary_key=True) 21 name=models.CharField( max_length=32) 22 city=models.CharField( max_length=32) 23 email=models.EmailField() 24 25 class Book(models.Model): 26 27 nid = models.AutoField(primary_key=True) 28 title = models.CharField( max_length=32) 29 publishDate=models.DateField() 30 price=models.DecimalField(max_digits=5,decimal_places=2) 31 32 # 与Publish建立一对多的关系,外键字段建立在多的一方 33 publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE) 34 # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表 35 authors=models.ManyToManyField(to=‘Author‘,)
在MYSQL生成的表如下:
注意事项:
在进行多表操作前,先创建一些基础的表数据:
publish表:
authordetail表:
author表:
3.1 一对多
book就是一对多的例子:
方式1: publish_obj=Publish.objects.get(nid=1) book_obj=Book.objects.create(title="金瓶眉",publishDate="2012-12-12",price=100,publish=publish_obj) 方式2: book_obj=Book.objects.create(title="金瓶眉",publishDate="2012-12-12",price=100,publish_id=1)
3.2 多对多
# 当前生成的书籍对象 book_obj=Book.objects.create(title="追风筝的人",price=200,publishDate="2012-11-12",publish_id=1) # 为书籍绑定的做作者对象 yuan=Author.objects.filter(name="yuan").first() # 在Author表中主键为2的纪录 egon=Author.objects.filter(name="alex").first() # 在Author表中主键为1的纪录 # 绑定多对多关系,即向关系表book_authors中添加纪录 book_obj.authors.add(yuan,egon) # 将某些特定的 model 对象添加到被关联对象集合中。 ======= book_obj.authors.add(*[])
数据库表纪录生成如下:
book表
book_authors表
核心:book_obj.authors.all()是什么?
多对多关系其它常用API
book_obj.authors.remove() # 将某个特定的对象从被关联对象集合中去除。 ====== book_obj.authors.remove(*[]) book_obj.authors.clear() #清空被关联对象集合 book_obj.authors.set() #先清空再设置
test
标签:3.2 复杂 场景 net djang div tom opened set
原文地址:https://www.cnblogs.com/huang-yc/p/9510616.html