django的多表操作

django的多表操作

1.使用场景

在实际生产过程多,我们面对的数据纷繁复杂,此时就需要良好的数据结构设计,多表之间的约束关系为我们提供了数据管理以及查询的便利。在MYsql中我们利用外键(foreign key)来实现这样的约束关系,在django中我们通过调用相应的API来实现这样的功能。

2.创建模型

实例:我们来假定下面这些概念,字段和关系

  • 作者模型:一个作者有姓名和年龄。作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(one-to-one)
  • 出版商模型:出版商有名称,所在城市以及email。
  • 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);
  • 一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many)。

模型建立的代码(module)如下:

 1 from django.db import models
 2 # Create your models here.
 3
 4 class Author(models.Model):
 5     nid = models.AutoField(primary_key=True)
 6     name=models.CharField( max_length=32)
 7     age=models.IntegerField()
 8
 9     # 与AuthorDetail建立一对一的关系
10     authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)
11
12 class AuthorDetail(models.Model):
13
14     nid = models.AutoField(primary_key=True)
15     birthday=models.DateField()
16     telephone=models.BigIntegerField()
17     addr=models.CharField( max_length=64)
18
19 class Publish(models.Model):
20     nid = models.AutoField(primary_key=True)
21     name=models.CharField( max_length=32)
22     city=models.CharField( max_length=32)
23     email=models.EmailField()
24
25 class Book(models.Model):
26
27     nid = models.AutoField(primary_key=True)
28     title = models.CharField( max_length=32)
29     publishDate=models.DateField()
30     price=models.DecimalField(max_digits=5,decimal_places=2)
31
32     # 与Publish建立一对多的关系,外键字段建立在多的一方
33     publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)
34     # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
35     authors=models.ManyToManyField(to=‘Author‘,)

在MYSQL生成的表如下:

注意事项:

  • 表的名称myapp_modelName,是根据 模型中的元数据自动生成的,也可以覆写为别的名称  
  • id 字段是自动添加的
  • 对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名
  • 这个例子中的CREATE TABLE SQL 语句使用PostgreSQL 语法格式,要注意的是Django 会根据settings 中指定的数据库类型来使用相应的SQL 语句。
  • 定义好模型之后,你需要告诉Django _使用_这些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中设置,在其中添加models.py所在应用的名称。
  • 外键字段 ForeignKey 有一个 null=True 的设置(它允许外键接受空值 NULL),你可以赋给它空值 None

3.添加表数据

在进行多表操作前,先创建一些基础的表数据:

publish表:

authordetail表:

author表:

3.1 一对多

book就是一对多的例子:

方式1:
   publish_obj=Publish.objects.get(nid=1)
   book_obj=Book.objects.create(title="金瓶眉",publishDate="2012-12-12",price=100,publish=publish_obj)

方式2:
   book_obj=Book.objects.create(title="金瓶眉",publishDate="2012-12-12",price=100,publish_id=1)

3.2 多对多

# 当前生成的书籍对象
    book_obj=Book.objects.create(title="追风筝的人",price=200,publishDate="2012-11-12",publish_id=1)
    # 为书籍绑定的做作者对象
    yuan=Author.objects.filter(name="yuan").first() # 在Author表中主键为2的纪录
    egon=Author.objects.filter(name="alex").first() # 在Author表中主键为1的纪录

    # 绑定多对多关系,即向关系表book_authors中添加纪录
    book_obj.authors.add(yuan,egon)    #  将某些特定的 model 对象添加到被关联对象集合中。   =======    book_obj.authors.add(*[])

数据库表纪录生成如下:
book表

book_authors表

核心:book_obj.authors.all()是什么?
多对多关系其它常用API

book_obj.authors.remove()      # 将某个特定的对象从被关联对象集合中去除。    ======   book_obj.authors.remove(*[])
book_obj.authors.clear()       #清空被关联对象集合
book_obj.authors.set()         #先清空再设置

test

原文地址:https://www.cnblogs.com/huang-yc/p/9510616.html

时间: 2024-10-07 21:41:00

django的多表操作的相关文章

Django数据库数据表操作

建立表单 django通过设置类来快速建表,打开models.py 例: from __future__ import unicode_literals from django.db import models # Create your models here. # 新建一个类叫user,其实就是新建一张叫user的表 class user(models.Model): username = models.CharField(max_length = 20) password = models

Django ORM 多表操作

创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及email. 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-

django之单表操作

1.查询方法: <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误. <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> order_by(*field): 对查询结果排序('-id') <6>

django之多表操作

一.表与表之间的关系 一对一:(OneToOneField)  关系字段无论建在哪张表里都可以,但是推荐建在查询频率比较高的那张表 [publish = models.ForeignKey(to='Publish')] 一对多:(ForeignKey)   一对多字段建在多的那一方 多对多:(ManyToManyField)    多对多字段无论建在哪张关系表里都可以,但是推荐建在查询频率比较高的那张表 ps: 如何判断表与表之间到底什么关系 换位思考:A能不能有多个B B能不能有多个A    

django orm单表操作

orm语句 -- sql -- 调用pymysql客户端发送sql -- mysql服务端接收到指令并执行 增: 方式1: new_obj = models.UserInfo( id=2, name='小猿1', bday='2019-09-27', checked=1, ) new_obj.save() 方式2: # ret 是创建的新的记录的model对象(重点) ret = models.UserInfo.objects.create( name='小猿2', bday='2019-08-

python——Django(ORM连表操作)

一对多 class UserType(models.Model): caption = models.CharField(max_length=32) class UserInfo(models.Model): user_type = models.ForeignKey(UserType)# user_type对象中封装id,caption username = models.CharField(max_length=32) age = models.IntegerField() 增: 1.外键

Django使用普通表单、Form、以及modelForm操作数据库方式总结

Django使用普通表单.Form.以及modelForm操作数据库主要应用于增删该查的情景下,流程通用如下,只是实现方式不一样: 进入填写表单页面: 在表单页面填写信息,并提交: 表单数据验证 验证成功,和数据库进行交互(增删改查): 验证成功,页面提示表单填写失败: 一.Django使用普通表单操作数据库 1.html代码: <form action="/add/" method="post" name="addbook"> {%

Django开发:(3.1)ORM:单表操作

MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动 ORM是"对象-关系-映射"的简称. Mysql中的表对应python中的类,表的字段对应类的属性,表的记录对应类的实例化的对象 单表操作 创建表 1. 创建模型 创建名为app01的app,在app01下的models.py中创建模型: from dj

Django多表操作

多表操作:以book,publish, author为例 一对多:一旦确定一对多的关系,在多的一方(book)创建关联字段publish_id 多对多:一旦确定多对多的关系,创建第三张表,比如Author2Book表,字段分别是id,Book_id, Author_id 一对一:两张表其实就是一张表,在任意一张表创建关联字段 from django.db import models # Create your models here. #不用创建ID,Django自动创建主键 class Boo