四、Django学习之关系表介绍及使用

关系表介绍及使用

一对一关系

xx = models.OneToOneField(to='表名',to_field='字段名',on_delete=models.CASCADE)
#on_delete:删除时的一些级联效果,to_field可以不写,默认是关联到另一张表的主键,on_delete在1.x版本的django中不用写,默认是级联删除的,2.x版本的django要写.

增加数据

方式1

new_author_detail = models.AuthorDetail.objects.create(
        birthday='1979',
        telephone='138',
        addr='black'
    )
    # 方式1
    models.Author.objects.create(
        name='王涛',
        age=18,
        #直接将对象赋值属性
        authorDetail=new_author_detail
    )

方式2

new_author_detail = models.AuthorDetail.objects.create(
        birthday='1979',
        telephone='138',
        addr='black'
    )
    # 方式2
    models.Author.objects.create(
        name='王涛',
        age=18,
        authorDetail_id=new_author_detail.id
    )

删除数据

表一外键关联到表二,表一删除,不影响表2,表2删除会影响表1

models.AuthorDetail.objects.get(id=2).delete()
models.Author.objects.get(id=3).delete()

更新数据

models.Author.objects.filter(id=5).update(
        name='崔老师',
        age=16,
        authorDetail=models.AuthorDetail.objects.get(id=5),
        authorDetail_id=4,
     )

一对多关系

xx = models.ForeignKey(to='表名',to_field='字段名',on_delete=models.CASCADE)

增加数据

方式1

外键关联的直接赋值为某个对象即可

obj = models.Publish.objects.get(id=1)
models.Book.objects.create(
    title='李帅',
    publishDate='2019-07-22',
    price=3,
    publishs=obj
)

方式2

obj = models.Publish.objects.get(id=1)
models.Book.objects.create(
        title='李帅test',
        publishDate='2019-07-22',
        price=3.5,
        publishs_id=1 #可以是整型,也可以是对象的属性(id)
        #publishs_id=obj.id
    )

删除数据

models.Publish.objects.get(id=1).delete()
models.Book.objects.get(nid=1).delete()

更新数据

models.Book.objects.filter(pk=4).update(
title='B哥的往事2',
publishs=models.Publish.objects.get(id=3),
publishs_id=3, #注意级联关系 不能乱改
    )

多对多关系

xx = models.ManyToManyField(to='另外一个表名') #这是自动创建第三表

添加数据

book_obj = models.Book.objects.get(nid=1)
    book_obj.authors.add(*[1,2])

删除数据

book_obj = models.Book.objects.get(nid=6)
book_obj.authors.remove(6)#将某个特定的对象从被关联对象集合中去除。
book_obj.authors.remove(*[5,6])
book_obj.authors.clear() #情况与nid 6相关联的所有
book_obj.authors.add(*[1,])#添加表记录
book_obj.authors.set('1')#先清空然后在设置
book_obj.authors.set(['5','6']) #删除然后更新

示例

from django.db import models

# Create your models here.

from django.db import models

# Create your models here.
#作者表
class Author(models.Model): #比较常用的信息放到这个表里面
    name=models.CharField( max_length=32)
    age=models.IntegerField()
    # authorDetail=models.OneToOneField(to="AuthorDetail",to_field="nid",on_delete=models.CASCADE)
    authorDetail=models.OneToOneField(to='AuthorDetail')  #一对一到AuthorDetail表  生成为表字段之后,会自动变为authorDetail_id这样有一个名称

    # 外键字段 -- 外键字段名_id

    # foreign+unique

    def __str__(self):
        return self.name

#作者详细信息表
class AuthorDetail(models.Model):
    birthday=models.DateField()
    # telephone=models.BigIntegerField()
    telephone=models.CharField(max_length=32)
    addr=models.CharField( max_length=64)
    def __str__(self):
        return self.addr

#出版社表   和 书籍表 是 一对多的关系
class Publish(models.Model):
    name=models.CharField( max_length=32)
    city=models.CharField( max_length=32)
    email=models.EmailField()  #charfield -- asdfasdf
    def __str__(self):
        return self.name

#书籍表
class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField( max_length=32)
    publishDate=models.DateField()
    price=models.DecimalField(max_digits=5,decimal_places=2)  #decimal(16,2)
    publishs=models.ForeignKey(to="Publish")
    authors=models.ManyToManyField(to='Author',)

    def __str__(self):
        return self.title

原文地址:https://www.cnblogs.com/antmoe/p/12233311.html

时间: 2024-10-08 03:32:21

四、Django学习之关系表介绍及使用的相关文章

三、Django学习之单表查询接口

查询接口 all() 查询所有结果,结果是queryset类型 filter(**kwargs) and条件关系:参数用逗号分割表示and关系 models.Student.objects.filter(id=1,name='dazhuang').update( name='大壮禅师', age = 78, ) 其中filter的参数也可以通过字典方式传入 odels.Student.objects.filter(**{'id':7,'name':'大壮禅师'}).update(age=100)

django学习之Model(四)MakingQuery

上一篇写到MakingQuey中的filter,本篇接着来. 10)-扩展多值的关系 如果对一个ManyToManyField或ForeignKey的表进行filter过滤查询的话,有2中方法可以用.分别是: #1 Blog.objects.filter(entry__headline__contains='Lennon', entry__pub_date__year=2008) #2 Blog.objects.filter(entry__headline__contains='Lennon')

Django学习笔记(四)—— Admin

疯狂的暑假学习之  Django学习笔记(四)-- Admin 参考:<The Django Book> 第6章 Django 可以使用admin自动创建管理界面. 1. 配置 django-admin.py startproject 创建的项目,如果没有注解掉默认的配置,python manage.py syncdb 创建用户后,直接 http://xxxxxx/admin 输入密码即可进入. 如果修改了配置文件,保证将 django.contrib.admin 加入setting.py 中

Django学习手册 - ORM 数据表操作

queryset 数据类型介绍 QuerySet与惰性机制 所谓惰性机制:表名.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行. QuerySet特点: <1>  可迭代的 <2>  可切片 <3>  惰性计算和缓存机制 例: info=models.table_name.objects.all()[0:5] #切片 info= models.table

Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process using '"' #可以直接用 python3 -m pip 代替 pip3 #这个问题是pip3 版本过低直接在cmd中执行 python3 -m pip install --upgrade pip 更新pip3 # 在指定解释器环境下安装django 1.11.9 # 在真实python3环境

Django学习之django自带的contentType表

Django学习之django自带的contentType表 通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/aaronthon/article/details/81714496 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. models.py文件的表结构写好后,通过makemigrations和migrate两条命令

Django orm关系表的创建 、路由层以及视图层

一.Django 表关系的创建 1.表的对应关系 一对多 多对多 一对一 2.如何判断表的对应关系 利用换位思考的方式,分别站在两张表的角度上去思考 这里比如我们以图书管理系统为例来创建几个简单的表 图书表 出版社表 作者表 为了方便演示,这里我们就强行规定了表之间的关系: 图书和出版社是一对多的外键关系,一对多外键关系 将外键字段建在多的哪一张表上 图书与作者之间是多对多的外键关系,多对多的外键关系 外键字段无论建在那张表都可以,但是推荐你建在查询频率高的那张    表上 作者与作者与作者详情

Django学习笔记(五)—— 表单

疯狂的暑假学习之  Django学习笔记(五)-- 表单 参考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path                                 除域名以外的请求路径,斜杠开头                      "/hello/" request.get_host()                      主机名                              

SQL学习之使用命令方式创建、删除与修改关系表

首先,先介绍用命令方式创建.删除和修改关系表, (1).创建表 基本格式:create table 表名 ( 列名 数据类型 列级完整性约束,列名 数据类型 列级完整性约束(如果有多个列,注意要用       英文式的逗号隔开)       ,表级完整性约束(表级完整性约束和列级完整性约束之间也要用逗号分隔开) ) 列级完整性约束有: not null 限制列取值为空 default 指定列的默认值 unique 定义列取值不能重复 check 定义列的取值范围(check是定义的多列之间的取值