一、背景

为什么要写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值

image-20200723164120701

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书籍时直接传模型对象即可(非模型对象下的具体值)

image-20200723164601030

三、多对多添加记录

多对多的模式主要体现在第三张表添加数据,通过第三张表能将两张表关联起来。例如如下查看关联关系,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方法用于设置
最后修改日期: 2023年12月16日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。