一、我们现在有这么个数据模型关系
我有四个对像:作者,作者详情,出版社,书籍,那关系模型建模
1、作者和作者详情,这个不用说,一定是一对一关系
2、作者和书籍,一个作者可以出多本书,一本书可以有多个作者,那就是多对多关系
3、出版社和书籍,一个出版社可以出多个书籍,那就是一多对多关系
具体如下图
二、现在创建表格:
重点问题我加了注释!!敲黑板!!一定注意!!
from django.db import models
# Create your models here.
class Author(models.Model):
author_name = models.CharField(max_length=8, null=False)
class AuthorDetail(models.Model):
author_sex = models.IntegerField(choices=((0, "男"), (1, "女")), null=False)
author_phone = models.CharField(max_length=11,null=False)
author_age = models.IntegerField(null=False)
#一对一关系的两个类,关系模型写到哪个类里都行,但是代码是顺序执行的,如果放在第一个类,在执行
#到对应表格时,还没有创建,所以要写到第二个类里
#models.CASCADE是级联删除,即关系方数据删掉,本表的相关信息也一并删掉,可参考前面的外键博客
author = models.OneToOneField(to=Author,to_field="id",on_delete=models.CASCADE)
class Publisher(models.Model):
publisher_name = models.CharField(max_length=30,null=False)
publisher_address = models.CharField(max_length=50,null=False)
publisher_city = models.CharField(max_length=30,null=False)
publisher_website = models.URLField(null=True)
class Book(models.Model):
book_name = models.CharField(max_length=20,null=False)
#多对多关系与一对一关系同理,写到哪个都行,也是顾及代码执行顺序,要写到下面的类里
author = models.ManyToManyField(to=Author)
#一对多关系,要写到多的类里
publisher = models.ForeignKey(to=Publisher,to_field="id",on_delete=models.CASCADE)
price = models.FloatField(max_length=6,null=None)
三、相关操作
1、增加一条数据
单表增加
Author.objects.create(author_name="老虎")
一多对关系:先查询外键对像,再增加
author = Author.objects.filter(author_name="老虎").first() AuthorDetail.objects.create(author=author, author_phone="15010133434", author_age=24, author_sex=0)
多对多关系:
publisher = Publisher.objects.get(publisher_name="辽宁大学出版社") author = Author.objects.get(author_name="李四") book = Book.objects.create(publisher=publisher,book_name="你好未来",price=35.5) book.author.add(author)
2、查询数据
单个表格查询
author = Author.objects.filter(author_name="老虎").first() author = Author.objects.get(author_name="老虎")说一下get和filter的区别
区别 get filter 查询结果 返回一个对像 返回一个列表 查询异常 数据库只能有一条对像,如果查询出多条或者没有会报错 数据库没有会返回长度是0的列表,所以在调用列表里某个对像时,应当像列表一样加个脚标。first()是取列表中第一个对像的意思 终上所述,推荐使用filter
查询字段:
(1)获取包含你的所有字段
Author.objects.filter(author_name__contains="你").all()
返回结果:<QuerySet [<Author: Author object (11)>, <Author: Author object (12)>]>
(2)获取指定字段:
第一种写法
Author.objects.filter(author_name__contains="你").values("id","author_name")
返回结果:<QuerySet [{'id': 11, 'author_name': '你妹'}, {'id': 12, 'author_name': '你妹'}]>
第二种写法:
Author.objects.filter(author_name__contains="你").values_list("id","author_name")
返回结果:<QuerySet [(11, '你妹'), (12, '你妹')]>
即values和values_list的区别,一个是返回字典,一个是返回列表
一对多关系查询
Author.objects.filter(author_name="张三").first().authordetail #正像查询 AuthorDetail.objects.filter(id=2).first().author #返向查询
多对多关系查询
book = Book.objects.filter(book_name="你好未来",id=3).first()
author = book.author.all()
返回结果:<QuerySet [<Author: Author object (14)>]>
3、修改数据
修改一个值:先查询再修改
Author.objects.filter(author_name="张三").update(author_name ="毛毛")
4、删除:先查询,再删除
author = Author.objects.filter(author_name="张三").first()
author.delete()
文章评论