一、我们现在有这么个数据模型关系

我有四个对像:作者,作者详情,出版社,书籍,那关系模型建模

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的区别

区别getfilter
查询结果返回一个对像返回一个列表
查询异常数据库只能有一条对像,如果查询出多条或者没有会报错数据库没有会返回长度是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()

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐