4.ORM操作中管理对象的获取及使用

我们在使用ORM来操作有外键和多对多关系的数据库时,免不了用到管理对象,但管理对象的获取很容易混淆,特此来记录一下

以下是我们要用到的models

class Publisher(models.Model):
    pid = models.AutoField(primary_key=True)   #主键
    name = models.CharField(max_length=32,unique=True) #出版社名称
    def __str__(self):
        return self.name

class Book(models.Model):
    id = models.AutoField(primary_key=True)   #主键
    title = models.CharField(max_length=32,unique=True)    #书籍的名称
    publisher = models.ForeignKey("Publisher",on_delete=models.CASCADE,related_name="books")  #外键

    def __str__(self):
        return "object:{}-{}>".format(self.title,self.id)

class Author(models.Model):
    id = models.AutoField(primary_key=True) #主键 作者的id
    name = models.CharField(max_length=32,unique=True)   #作者的名字
    books = models.ManyToManyField(Book,)  #表示作者和书籍的关系  多对多

1.获取方法

1.基于外键

我们可以看到书籍表中存在外键,书籍表与出版社表之间通过外键连接,我们只能获得出版社的管理对象
获取方法:
pub_obj = models.Publisher.objects.get(pid=1)
obj = pub_obj.books  #设置related_name
obj = pub_obj.books_set  #未设置related_name

2.基于多对多关系

Book表和Author表之间存在多对多关系,Book类对象和Author类对象都可以获取管理对象
我们在Author表中定义了多对多字段

Author类对象获取管理对象:
ah_obj = models.Author.objects.get(id=2)
obj = ah_obj.books   #直接通过设置多对多字段的名称

Book类对象获取管理对象:
bk_obj = models.Book.objects.get(id=19)
obj = bk_obj.author    #设置related_name
obj = bk_obj.author_set   #未设置related_name

2.使用

all拿到所有的关联对象
set参数为id列表,或对象列表,设置关联对象
add参数为id或对象,添加关联对象并绑定关系
remove参数为id或对象,移除关联对象并删除关系(单个)
clear清空关联对象(全部)
create创建关联对象并绑定关系
all:
ah_obj = models.Author.objects.get(id=2)
obj = ah_obj.books
print(obj.all())

#我们可以获取到id为2的author对象关联的全部book对象
set:
ah_obj = models.Author.objects.get(id=2)
obj = ah_obj.books
obj.set(21)

#将id为2的作者对象的书籍全部设置为id为21的书籍
#要注意,设置的id在book表中得存在
add:
ah_obj = models.Author.objects.get(id=2)
obj = ah_obj.books
obj.add(21)
obj.add(models.Book.objects.get(id=21))

#为id为2的作者对象新增一个id为21的书籍对象的关联关系
#要注意,新增的id必须在book表中
remove:
ah_obj = models.Author.objects.get(id=2)
obj = ah_obj.books
obj.remove(21)

#将id为2的作者对象移除id为21的书籍对象的关联关系
#要注意,移除的id本身就已经关联了
clear:
ah_obj = models.Author.objects.get(id=2)
obj = ah_obj.books
obj.clear()

#清除id为2的作者对象关联的所有书籍
create:
ah_obj = models.Author.objects.get(id=2)
obj = ah_obj.books
obj.create(title="鲁宾逊漂流记",id=30)

#为id为2的作者对象创建一个id位30,名称为鲁滨逊漂流记的书籍

总结
1.外键存在的类中,写外键的类的独享不能获取到管理对象
2.存在多对多关系的类中,双方都能获得管理对象,只不过获取的方式不同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值