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   #设置关联对象
add   #添加关联对象
remove  #移除关联对象(单个)
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.存在多对多关系的类中,双方都能获得管理对象,只不过获取的方式不同

上一篇:汇编——大写变小写


下一篇:再见,网易云音乐!