django之多表操作

一、表与表之间的关系

  一对一:(OneToOneField)  关系字段无论建在哪张表里都可以,但是推荐建在查询频率比较高的那张表

      【publish = models.ForeignKey(to=‘Publish‘)】

  一对多:(ForeignKey)   一对多字段建在多的那一方

  多对多:(ManyToManyField)    多对多字段无论建在哪张关系表里都可以,但是推荐建在查询频率比较高的那张表

  ps: 如何判断表与表之间到底什么关系

    换位思考:A能不能有多个B

         B能不能有多个A

     增改删:可以是数字,也可以是对象

    add()        # 添加

    set()      #   修改

    remove()    #不能接收可迭代对象,可以* querySet对象

    clear()      #  清空 不用传参

  删中设置级联删除:

    publish = models.ForeignKey(to=‘Publish‘, on_delete=models.CASCADE)
    publish = models.ForeignKey(to=‘Publish‘, on_delete=models.SET_NULL, null=True)  # 取消级联删除一定要设置null=True
        CASCADE:  设置级联删除,即删除了出版社,对应的该出版社的书也会一块删除    SET_NULL:  取消级联删除

正向与反向的概念

models:

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    publist_date = models.DateField(auto_now_add=True)
    # publish = models.ForeignKey(to=‘Publish‘, to_field=‘id‘, on_delete=models.CASCADE,)
    publish = models.ForeignKey(to=‘Publish‘, on_delete=models.SET_NULL, null=True)
    authors = models.ManyToManyField(to=‘Author‘)  # 虚拟字段

class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)
    email = models.EmailField()  # 对应就是varchar类型

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    authordetail = models.OneToOneField(to=‘AuthorDetail‘)

class AuthorDetail(models.Model):
    phone = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)

正向查询按字段,反向查询按表名小写...

一对一
  正向:author---关联字段在author表里--->authordetail 按字段
   反向:authordetail---关联字段在author表里--->author 按表名小写
     查询jason作者的手机号 正向查询
     查询地址是 :山东 的作者名字 反向查询

一对多
  正向:book---关联字段在book表里--->publish 按字段
  反向:publish---关联字段在book表里--->book 按表名小写_set.all() 因为一个出版社对应着多个图书

多对多
  正向:book---关联字段在book表里--->author 按字段
  反向:author---关联字段在book表里--->book 按表名小写_set.all() 因为一个作者对应着多个图书

查询出版社是东方出版社出版的书籍 一对多字段的反向查询
  publish_obj = models.Publish.objects.filter(name=‘东方出版社‘).first()
  print(publish_obj.book_set) # app01.Book.None
  print(publish_obj.book_set.all())

查询作者jason写过的所有的书 多对多字段的反向查询
  author_obj = models.Author.objects.filter(name=‘jason‘).first()
  print(author_obj.book_set) # app01.Book.None
  print(author_obj.book_set.all())

查询作者电话号码是110的作者姓名 一对一字段的反向查询
  authordetail_obj = models.AuthorDetail.objects.filter(phone=110).first()
  print(authordetail_obj.author.name)

原文地址:https://www.cnblogs.com/qingqinxu/p/11260497.html

时间: 2024-11-01 09:24:27

django之多表操作的相关文章

django的多表操作

django的多表操作 1.使用场景 在实际生产过程多,我们面对的数据纷繁复杂,此时就需要良好的数据结构设计,多表之间的约束关系为我们提供了数据管理以及查询的便利.在MYsql中我们利用外键(foreign key)来实现这样的约束关系,在django中我们通过调用相应的API来实现这样的功能. 2.创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄.作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(

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 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