一、背景
为什么要写ORM的多表添加,因为我操作了后还是记不住里面的表达式。所以记录下来
二、一对多添加记录
一对多添加记录指有两种表,同时有一张表中有个字段设置为另外一张表某字段的外键。现在在类型对’多’的这张表下添加记录。
2.1模型层代码示例
models.py
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=30)
price = models.DecimalField(max_digits=6, decimal_places=2)
pub_date = models.DateField()
publish = models.ForeignKey('Publish',to_field="id",on_delete=models.CASCADE,null=True)
author = models.ManyToManyField('Author',db_table='book2author')
class Publish(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
city = models.CharField(max_length=60)
email = models.CharField(max_length=50)
#类Book中定义了publish字段
2.2添加记录方式一
views.py
from app01.models import *
def add(request):
#一对多添加 方式一 添加一本书籍,出版社为苹果出版社(publish出版社表id=1)
Book.objects.create(title='Linux',price=120,pub_date='2012-12-12',publish_id=1)
return HttpResponse("添加成功")
备注:这里直接将模型生成的book表字段publish_id传值进去,而传的值1表示苹果出版社id值
2.3添加记录方式二
from app01.models import *
def add(request):
#一对多添加 方式一
# Book.objects.create(title='Linux',price=120,pub_date='2012-12-12',publish_id=1)
#方式二
pub_obj = Publish.objects.filter(name='苹果出版社').first()
book = Book.objects.create(title='php',price=90,pub_date='2017-03-08',publish=pub_obj)
# print(book)
return HttpResponse("添加成功")
备注:方式二比较灵活,首先查出苹果出版社模型对象,在添加book书籍时直接传模型对象即可(非模型对象下的具体值)
三、多对多添加记录
多对多的模式主要体现在第三张表添加数据,通过第三张表能将两张表关联起来。例如如下查看关联关系,book表与author表存在着多对多关系,第三张表为book2author。即一本书可以有多个作者,一个作者也可以绑定多本书。ManyToManyField可以写到两张表中任意一张表中
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=30)
price = models.DecimalField(max_digits=6, decimal_places=2)
pub_date = models.DateField()
publish = models.ForeignKey('Publish',to_field="id",on_delete=models.CASCADE,null=True)
author = models.ManyToManyField('Author',db_table='book2author')
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
age = models.IntegerField()
ad = models.OneToOneField('AuthorDetail',on_delete=models.CASCADE,null=True)
3.1添加记录
def add(request):
#ManyToManyField添加 给Linux这本书绑定两个作者 alex egon
linux = Book.objects.filter(title='Linux').first()
elex = Author.objects.filter(name='alex').first()
egon = Author.objects.filter(name='egon').first()
linux.author.add(elex,egon)
#linux.author.set([egon,])
return HttpResponse("添加成功")
备注:首先找到linux这本书(如果是想在添加时绑定作者则还需要create()方法),再找到两个作者elex、egon。通过找到两个类之间的关联关系(linux.author),使用add方法进行添加
3.2删除记录
def add(request):
#ManyToManyField添加 给Linux这本书绑定两个作者 alex egon
linux = Book.objects.filter(title='Linux').first()
elex = Author.objects.filter(name='alex').first()
egon = Author.objects.filter(name='egon').first()
linux.author.remove(elex,egon)
#linux.author.set([egon,])
return HttpResponse("添加成功")
备注:同理,使用remove方法进行删除,同时clear方法用于清空,set方法用于设置
留言