Django多变关联、增加数据、删除数据

建立表之间的关联关系:

models.py里面对表的字段及外键关系的设置如下:

from django.db import models

# Create your models here.

#出版社表
class Publish(models.Model):
    nid=models.AutoField(primary_key=True)
    name=models.CharField(max_length=32)
    addr=models.CharField(max_length=64)
    email=models.EmailField()

    def __str__(self):
        return self.name

#作者表(与AuthorDetail是一对一关系)
class Author(models.Model):
    nid=models.AutoField(primary_key=True)
    name=models.CharField(max_length=32)
    age=models.IntegerField()
    #建立与AuthorDetail一对一关系
    authordetail=models.OneToOneField(to=‘AuthorDetail‘,to_field=‘nid‘)

    def __str__(self):
        return self.name

#作者详细信息表
class AuthorDetail(models.Model):
    nid=models.AutoField(primary_key=True)
    phone=models.CharField(max_length=32)
    email=models.EmailField()

    def __str__(self):
        return self.phone

#书籍表
class Book(models.Model):
    nid=models.AutoField(primary_key=True)
    name=models.CharField(max_length=32)
    price=models.DecimalField(max_digits=5,decimal_places=2)
    pub_date=models.DateField()
    #与出版社绑定一对多关系
    publish=models.ForeignKey(to=‘Publish‘,to_field=‘nid‘)

    #与作者绑定多对多关系(会生成第三张表)
    authors=models.ManyToManyField(to=‘Author‘)

    def __str__(self):
        return self.name

执行后生成的表格关系图,如下:

 增加数据:

1.一对一表的增加

#增加
#一对一表的增加(Author--AuthorDetail)
    #先创建没有外键的数据,即先建作者详细表
    # authordetail=AuthorDetail.objects.create(phone=‘3333333‘,email=‘[email protected]‘)
    # print(authordetail,type(authordetail)) #AuthorDetail object <class ‘app01.models.AuthorDetail‘>
    # print(authordetail.email) #[email protected]

    #author建立方式一:手动指定关联authordetail表
    # author=Author.objects.create(name=‘作者1‘,age=13,authordetail_id=2)
    # print(author) #作者1

    #author建立方式二:可以传个对象(默认绑定的就是作者详情表里面的最后一条记录)
    # author = Author.objects.create(name=‘作者2‘, age=13, authordetail=authordetail)
    # print(author) #作者2

    #一对多表的增加(Book--Publish)
    # Publish.objects.create(name=‘北京出版社‘,addr=‘北京‘,email=‘[email protected]‘)
    # publish=Publish.objects.create(name=‘南京出版社‘,addr=‘南京‘,email=‘[email protected]‘)
    # print(publish) #南京出版社
    # publish=Publish.objects.create(name=‘广州出版社‘,addr=‘广州‘,email=‘[email protected]‘)

    # book=Book.objects.create(name=‘在路上‘,price=23.1,pub_date=‘2011-01-23‘,publish=publish)
    # print(book)  #在路上

    #注意的点,关联键传的时候要不是手动指定相关表的id号,要不就是只能传对象,例如下面操作:
    # publish=Publish.objects.filter(name=‘北京出版社‘) #注意这里拿到的是queryset对象
    # print(publish) #<QuerySet [<Publish: 北京出版社>]>

    # publish = Publish.objects.filter(name=‘北京出版社‘).first() #是对象
    # print(publish)  # 北京出版社
    #手动创建一本书去,通过出版社对象.nid 与对象的‘北京出版社’做绑定
    # book=Book.objects.create(name=‘你若安好‘,price=23,pub_date=‘1991-1-3‘,publish_id=publish.nid)

2.多对多表的增加

#多对多表的添加add(通过Book、Author2张表,在book_authors表里面录入信息,完成多对多的绑定关系)
    #方式一:add(作者的id,作者的id)
    # book=Book.objects.create(name=‘红楼梦‘,price=120,pub_date=‘1891-01-11‘,publish_id=1)
    # print(book)
    # print(book.authors.all(),type(book.authors)) #book.authors类型是manager
    #将红楼梦书绑定作者1、作者2
    # res=book.authors.add(1,2)
    # ret=book.authors.add(*(2,5))

    #方式二:add(作者的对象)
    #第一步:先拿到你想关联的作者的对象
    # author=Author.objects.filter(nid=2).first()
    # print(author) #作者2

    #第二步:直接将对象传给add(),即可以将下面书和上面的作者,在第三种表里完成绑定关系并录入
    # book=Book.objects.filter(name=‘便是晴天‘).first()  #记得传的一定要是对象
    # book.authors.add(author)

 解除表之间的绑定关系(remove、clear、set)

#解除绑定
# Remove依次删除一条或多条
    # book=Book.objects.filter(nid=4).first()
    # print(book)
    #手动指定id结果关联
    #移除nid=4的书与 nid=2的作者 的绑定
    # res=book.authors.remove(2)
    # print(res)

    #传对象解除关联
    # author=Author.objects.filter(nid=2).first()
    # book=Book.objects.filter(nid=3).first()
    # ret=book.authors.remove(author)
    # print(ret) #None

    #如果1本书绑定的有多个作者,可以传多个值
    # ret=book.authors.remove(2,5)
    # ret=book.authors.remove(*(2,5))

# clear 一次性全部解除绑定关系
    # book = Book.objects.filter(pk=9).first()
    # book.authors.clear()

#set 用法,参数必须传可迭代对象,可以传id,也可以传对象

    #方式一:传nid
    #先解除所有与书nid=3的所有绑定
    # book=Book.objects.filter(nid=3).first()
    # #再建立一个新的与作者nid=3的绑定
    # res=book.authors.set([3])  #一定是个可迭代的对象
    # print(res)

    #方式二:传对象
    # book=Book.objects.filter(nid=2).first()
    # #会先执行上面与书2的绑定,再执行下面新的绑定
    # author=Author.objects.filter(nid=2).first() #author是个对象
    # book.authors.set([author]) #传一个可迭代对象

 set( [ 可迭代对象] )的用法图解:

用法一:

#方式一:传nid#先解除所有与书nid=3的所有绑定# book=Book.objects.filter(nid=3).first()# #再建立一个新的与作者nid=3的绑定# res=book.authors.set([3])  #一定是个可迭代的对象# print(res)

用法二:

#方式二:传对象
book=Book.objects.filter(nid=2).first()
#会先执行上面与书2的绑定,再执行下面新的绑定
author=Author.objects.filter(nid=2).first() #author是个对象
book.authors.set([author]) #传一个可迭代对象

  

原文地址:https://www.cnblogs.com/yangzhizong/p/9629597.html

时间: 2024-08-01 18:49:45

Django多变关联、增加数据、删除数据的相关文章

ORACLE数据删除数据删除的解决办法

今天主要以oracle数据库为例,介绍关于表中数据删除的解决办法.(不考虑全库备份和利用归档日志)删除表中数据有三种方法:·delete(删除一条记录)·drop或truncate删除表格中数据 1.delete误删除的解决方法原理: 利用oracle提供的闪回方法,如果在删除数据后还没做大量的操作(只要保证被删除数据的块没被覆写),就可以利用闪回方式直接找回删除的数据具体步骤为: *确定删除数据的时间(在删除数据之前的时间就行,不过最好是删除数据的时间点) *用以下语句找出删除的数据:sele

mysql的导入和导出数据,删除数据

本文转自网络优秀的文章 详细可以参考https://www.cnblogs.com/Cherie/p/3309456.html https://www.cnblogs.com/roverliang/p/6436140.html https://www.cnblogs.com/mkfywj/p/5452045.html https://www.cnblogs.com/waynechou/p/7794939.html 删除表内容,不删除表结构 truncate table 表名    --自动增长的

Web jquery表格组件 JQGrid 的使用 - 7.查询数据、编辑数据、删除数据

系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件及方法 Web jquery表格组件 JQGrid 的使用 - 5.Pager翻页.搜索.格式化.自定义按钮 Web jquery表格组件 JQGrid 的使用 - 6.准备工作 & Hello JQGrid Web jquery表格组件 JQGrid 的使用 - 7.查询数据.编辑数据.删除数据

MVC5 + EF6 + Bootstrap3 (13) 查看详情、编辑数据、删除数据

Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-rud.html 系列教程:MVC5 + EF6 + Bootstrap3 上一节:MVC5 + EF6 + Bootstrap3 (12) 新建数据 源码下载:点我下载 目录 前言 添加链接 查看详情 编辑数据 删除数据 结尾 前言 所谓万事开头难,前面用两节介绍了查询页面,一节介绍了创建数据.由于前面做了大量的铺垫,本节就能顺利的将查看详情.编辑数据.删

Oracle的学习二:表管理(数据类型、创建/修改表、添加/修改/删除数据、数据查询)

1.Oracle表的管理 表名和列名的命名规则: 必须以字母开头: 长度不能超过30个字符: 不能使用oracle的保留字: 只能使用如下字符:A-Z, a-z, 0-9, $, # 等. Oracle支持的数据类型: 字符型 char 定长 最大2000个字符 char(10)----'小韩' 前四个字符放'小韩',后添加6个空格补全.(查询效率高) varchar2(20) 变长 最大4000个字符 vachar2(10)----'小韩' oracle分配四个字符,这样可以节省空间. clo

mysql——插入、更新、删除数据(概念)

一.插入数据 1.为表的所有字段插入数据 -------------------------------------------------------------------------- (1)insert语句中不指定具体的字段名 语法格式:insert into 表名 values(值1,值2,……,值n); 表名指定记录插入到哪一个表中: 值等表示要插入的数据:值1到值n分别对应着表中的每一个字的:表中定义了几个字段,insert语句中就应该对应有几个值: 值插入的顺序与表中字段的顺序相

数据库中两张表之间的数据同步实现思路(增加、删除、更新)Mysql、sqlserver

分别创建增加.删除.更新的触发器(Trigger)来达到两张表之间数据同步的目的. 1:数据同步增加:如有两张表--A表和B表,创建触发器使当A表插入数据后B表也同步插入数据.其中B表插入数据的字段需要同A表中的字段相对应. CREATE TRIGGER 触发器名称 ON A表 AFTER INSERT AS BEGIN INSERT INTO B表(B表字段1,B表字段2,B表字段3) SELECT A表字段1,A表字段2,A表字段3 FROM INSERTED END 2.数据同步删除:如有

AngularJS实现数据列表的增加、删除和上移下移等功能实例

转: http://www.jb51.net/article/91991.htm 这篇文章给大家分享了AngularJS循环实现数据列表的增加.删除和上移下移等基础功能,对大家学习AngularJS具有一定的参考借鉴价值,有需要的朋友可以看看. 效果图 实例代码 <!DOCTYPE html> <html lang="en" ng-app="myapp" ng-controller="myCtrl"> <head&g

MySQL增加,删除,更新,导出数据

导出数据 将检索到的数据,保存到服务器的文件内. 通过:select * into outfile '文件地址' from xxx; select * from teacher_grade; select * into outfile 'd:/testmysql/result' from teacher_grade; 注意: 可以自动创建文件,但是不能重写已有文件. 生成的文件格式:默认的采用行来区分记录,制表符区分字段. 为了满足某种特别的需求,会采用不同的分割方式.支持在导出数据时,设置记录