django 多表操作

摘要:
三种关系一对一,一对多,多对多创建表1一对一2xx=模型。OneToOneField(to=“表名”,to_field=“字段名”,on_delete=models.CASCADE)#删除时的一些级联效果,to_字段可以留空。默认情况下,它是与另一个表关联的主键。On_Delete不需要在django的1.x版本中编写。默认情况下,它是级联删除。django的2.x版本需要编写。34一对多5xx=型号

三种关系 一对一,一对多,多对多

创建表

1 一对一
2     xx = models.OneToOneField(to='表名',to_field='字段名',on_delete=models.CASCADE)  #删除时的一些级联效果,to_field可以不写,默认是关联到另一张表的主键,on_delete在1.x版本的django中不用写,默认是级联删除的,2.x版本的django要写.
3     
4 一对多
5     xx = models.ForeignKey(to='表名',to_field='字段名',on_delete=models.CASCADE)
6 多对多
7     xx = models.ManyToManyField(to='另外一个表名') #这是自动创建第三表
8     
9 示例
10     from django.db importmodels
11 
12 #Create your models here.
13 
14 from django.db importmodels
15 
16 #Create your models here.
17 #作者表
18 class Author(models.Model): #比较常用的信息放到这个表里面
19     name=models.CharField( max_length=32)
20     age=models.IntegerField()
21     #authorDetail=models.OneToOneField(to="AuthorDetail",to_field="nid",on_delete=models.CASCADE)
22     authorDetail=models.OneToOneField(to='AuthorDetail')  #一对一到AuthorDetail表  生成为表字段之后,会自动变为authorDetail_id这样有一个名称
23 
24     #外键字段 -- 外键字段名_id
25 
26     #foreign+unique
27 
28     def __str__(self):
29         returnself.name
30 
31 #作者详细信息表
32 classAuthorDetail(models.Model):
33     birthday=models.DateField()
34     #telephone=models.BigIntegerField()
35     telephone=models.CharField(max_length=32)
36     addr=models.CharField( max_length=64)
37     def __str__(self):
38         returnself.addr
39 
40 
41 #出版社表   和 书籍表 是 一对多的关系
42 classPublish(models.Model):
43     name=models.CharField( max_length=32)
44     city=models.CharField( max_length=32)
45     email=models.EmailField()  #charfield -- asdfasdf
46     def __str__(self):
47         returnself.name
48 
49 #书籍表
50 classBook(models.Model):
51     nid = models.AutoField(primary_key=True)
52     title = models.CharField( max_length=32)
53     publishDate=models.DateField()
54     price=models.DecimalField(max_digits=5,decimal_places=2)  #decimal(16,2)
55     publishs=models.ForeignKey(to="Publish")
56     authors=models.ManyToManyField(to='Author',)
57 
58     def __str__(self):
59         returnself.title
60 
61 #手动创建第三张表,暂时忽略
62 #class BookToAuthor(models.Model):
63 #book_id = models.ForeignKey(to='Book')
64 #author_id = models.ForeignKey(to='Author')
65 ## xx = models.CharField(max_length=12)

增删改查

1 #1 增
2     #1.1 一对一增加
3     #new_author_detail = models.AuthorDetail.objects.create(
4     #birthday='1979-08-08',
5     #telephone='138383838',
6     #addr='黑龙江哈尔滨'
7     #)
8     #obj = models.AuthorDetail.objects.filter(addr='山西临汾').first()
9 
10     #方式1
11     #models.Author.objects.create(
12     #name='王涛',
13     #age='40',
14     #authorDetail=new_author_detail,
15     #)
16     #方式2  常用
17     #models.Author.objects.create(
18     #name='王涛',
19     #age='40',
20     #authorDetail_id=obj.id,
21     #)
22 
23     #一对多
24     #方式1
25     #obj = models.Publish.objects.get(id=2)
26     #models.Book.objects.create(
27     #title = '李帅的床头故事',
28     #publishDate='2019-07-22',
29     #price=3,
30     ## publishs=models.Publish.objects.get(id=1),
31     #publishs=obj,
32     #
33     #)
34     #方式2 常用
35     #models.Book.objects.create(
36     #title='李帅的床头故事2',
37     #publishDate='2019-07-21',
38     #price=3.5,
39     ## publishs=models.Publish.objects.get(id=1),
40     #publishs_id=obj.id
41     #
42     #)
43 
44     #多对多
45     #方式1   常用
46     #book_obj = models.Book.objects.get(nid=1)
47     #book_obj.authors.add(*[1,2])
48     #方式2
49     #author1 = models.Author.objects.get(id=1)
50     #author2 = models.Author.objects.get(id=3)
51     #book_obj = models.Book.objects.get(nid=5)
52     #book_obj.authors.add(*[author1,author2])

1 一对一和一对多的删除和单表删除是一样的
2 #一对一  表一外键关联到表二,表一删除,不影响表2,表2删除会影响表1
3     #models.AuthorDetail.objects.get(id=2).delete()
4     #models.Author.objects.get(id=3).delete()
5 
6     #一对多
7     #models.Publish.objects.get(id=1).delete()
8     #models.Book.objects.get(nid=1).delete()
9 
10     #多对多关系删除
11     #book_obj = models.Book.objects.get(nid=6)
12     #book_obj.authors.remove(6)
13     #book_obj.authors.remove(*[5,6])
14     #book_obj.authors.clear()
15     #book_obj.authors.add(*[1,])
16     #book_obj.authors.set('1')
17     #book_obj.authors.set(['5','6']) #删除然后更新

更新

1  #更新
2     #一对一
3     #models.Author.objects.filter(id=5).update(
4     #name='崔老师',
5     #age=16,
6     ## authorDetail=models.AuthorDetail.objects.get(id=5),
7     #authorDetail_id=4,
8     #)
9     #一对多
10     #models.Book.objects.filter(pk=4).update(
11     #title='B哥的往事2',
12     ## publishs=models.Publish.objects.get(id=3),
13     #publishs_id=3,
14     #)
15     
16     #一对多
17     models.Publish.objects.filter(pk=2).update(
18         id=4, #没有级联更新,报错!!
19     )

免责声明:文章转载自《django 多表操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇luogu P1364 医院设置.net core 跨域下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

设置Django生产环境系统重启后的自动启动项

前面,作者已经介绍了把Django部署到生产环境中的主要方法,现在我们来看一下如何设置项目开机启动。 在把Django项目部署到生产环境中时,我们前面使用安装包和源码安装了Nginx、uwsgi、redis等,这些应用安装后,不会使用系统默认服务一样来快速启停服务,需要到对应的安装目录下才能启动应用。如果服务因为某些原因重启,上述应用不能自动启用,实际生产...

Django的View(视图)

目录 Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。 无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了—...

django 框架模型之models常用的Field,及常见错误原因及处理方案。

1. django 模型models 常用字段          1、models.AutoField          自增列 = int(11)        如果没有的话,默认会生成一个名称为 id 的列        如果要显式的自定义一个自增列,必须设置primary_key=True。   2、models.CharField    ...

django项目部署到centos

服务器是使用的阿里云的centos 7.6 项目使用的是 Python3.9.5 + Django 3.2.4 目标:将django项目部署到centos上,centos + Python + django + uwsgi + nginx Python下载地址:https://www.python.org/ftp/python/3.9.5/ nginx下载...

Django 查询语句汇总

1.1.1 生成查询你创建完数据模型,django会自动提供给你数据库抽象的API,可以创建、获取、修改、删除对象,本篇文档讲解如何使用API。我们参考下面模型,一个weblog: #博客classBlog(models.Model): name=models.CharField(max_length=100) tagline=models.TextFie...

PyMongo 常见问题

PyMongo是线程安全的吗PyMongo是线程安全的,并且为多线程应用提供了内置的连接池 PyMongo是进程安全的吗PyMongo不是进程安全的,如果你在fork()中使用MongoClient实例,必须小心。具体来说,MongoClient实例不能从父进程复制到子进程,父进程和每个子进程必须创建属于自己的MongoClient实例。由于本身的不兼容性...