15DjangoORM一对多模型类的创建以及数据的创建和查询
一对多模型类的创建:
class Publisher(models.Model): #出版社[一] name = models.CharField('出版社名称',max_length=50) class Book(models.Model): #书【多】 title = models.CharField("书名",max_length=50,default='',unique=True) publisher = models.ForeignKey(Publisher,on_delete=models.CASCAD,null=True)
一对多数据的创建和查询:
反向查询有一个方法:小写类名_set(此方法可以获取一个objects对象)
(venv) D:\PycharmProjects\mysite3>python manage.py shell >>> from bookstore.models import * >>> p1 = Publisher.objects.create(name="中信出版社") #添加两本中信出版社的书 ^ >>> b1 = Book.objects.create(title="FastAPI",publisher=p1) >>> b2 = Book.objects.create(title="Flask",publisher_id=p1.id) #正向查询 >>> b1.publisher.name '中信出版社' #反向查询: >>> p1.book_set.all() <QuerySet [<Book: FastAPI__0.00_0.00>, <Book: Flask__0.00_0.00>]>
多对多模型的创建和数据的创建:
多对多关系:
mysql中创建多对多需要依赖第三张表来实现,但在django中无需手动创建第三张表,Django系统自动帮我们完成!
语法:在关联的两个类中的任意一个类中增加:
属性 = models.ManyToManyField(MyModel)
1多对多-模型创建:
class Author(models.Model): name = models.CharField('姓名',max_length=11,default='') class Book(models.Model): title = models.CharField("书名",max_length=50,default='',unique=True) authors = models.ManyToManyField(Author)
2多对多-数据创建
#方法1: 先创建两作者,然后利用反向属性_set去操作和自己关联的表 author1 = Author.objects.create(name='吕老师') author2 = Author.objects.create(name='王老师') #吕老师和王老师同时写了一本书 book11 = author1.book_set.create(title='centos8') #创建本书同时和吕老师绑定 author2.book_set.add(book11)#已经有了一个本了,给书添加作者的方法 #方法2 book = Book.objects.create(name='centos8') #先创建一本书 #吕老师和王老师同时写了一本书 author3 = book.authors.create(name='王老师') #然后为数创建作者 book.authors.add(author1) #给书增加作者
练习:
(venv) D:\PycharmProjects\mysite3>python manage.py shell >>> from bookstore.models import * #创建第一个作者 >>> a1 = Author.objects.create(name='guolaoshi') #创建一本书并绑定作者 >>> b1 = a1.book_set.create(title='centos8') >>> #创建第二个作者 >>> a2 = Author.objects.create(name='wanglaoshi') #把作者和已存在的书关联 >>> a2.book_set.add(b1) >>>
3多对多-数据查询
#多对多查询测试: def more_to_more_select_db(request): #from bookstore.models import * author_list=[] book_obj = Book.objects.get(title='centos8') author_obj=book_obj.authors.all().values("name") for ath in author_obj: author_list.append(ath) return HttpResponse("查询结果:%s"%author_list)