我们在使用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.存在多对多关系的类中,双方都能获得管理对象,只不过获取的方式不同