定义模型
创建数据
博客 和 条目 一对多
条目 和 作者 多对多
条目 和 条目详情 一对一
一对一
一对多
多对多
定义模型
from django.db import models
# Create your models here.
# 博客
class Blog(models.Model):
# 名字
name = models.CharField(max_length=100)
# 分类标签
tagline = models.CharField(max_length=50)
# 作者
class Author(models.Model):
# 姓名
name = models.CharField(max_length=25)
# 邮箱
email = models.CharField(max_length=50)
# 条目 —— 一对多
class Entry(models.Model):
# on_delete=models.CASCADE 及连删除
# 博客
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
# 标题
headline = models.CharField(max_length=255)
# 文本
body_text = models.TextField()
# 作者
author = models.ManyToManyField(Author)
# 条目详情
class EntryDetail(models.Model):
# 关联 Entry
entry = models.OneToOneField(Entry, on_delete=models.CASCADE)
# 详情
detail = models.TextField()
创建数据
模型定义好之后,要迁移,迁移后创建数据
迁移:
(class15env) PS D:\muyi\Django\muyi> python ./manage.py makemigrations
Migrations for 'the_7':
the_7\migrations\0001_initial.py
- Create model Author
- Create model Blog
- Create model Entry
- Create model EntryDetail
(class15env) PS D:\muyi\Django\muyi> python ./manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, the_5, the_7
Running migrations:
Applying the_7.0001_initial... OK
进入模型
python ./manage.py shell
引入
>>> from the_7.models import Blog,Author,Entry,EntryDetail
添加数据
>>> blog = Blog(name='muyi',tagline='python数据库')
>>> blog.save()
>>> blog = Blog(name='xiaoming',tagline='python数据分析')
>>> blog.save()
>>> blog = Blog(name='muyi',tagline='python数据库')
>>> blog.save()
>>> blog = Blog(name='xiaoming',tagline='python数据分析')
>>> blog.save()
>>> author = Author(name='muyi',email='37410307@qq.com')
>>> author.save()
>>> entry = Entry(blog=blog,headline='块数掌握python',body_text='多敲,多练,多思')
>>> entry.save()
python中查看数据库的数据
一对一操作
简单正向查询
正向关联查询
逆向查询
简单正向查询
from django.db import models
# Create your models here.
# 博客
class Blog(models.Model):
# 名字
name = models.CharField(max_length=100)
# 分类标签
tagline = models.CharField(max_length=50)
def __str__(self):
return self.tagline
# 作者
class Author(models.Model):
# 姓名
name = models.CharField(max_length=25)
# 邮箱
email = models.CharField(max_length=50)
def __str__(self):
return self.name
# 条目 —— 一对多
class Entry(models.Model):
# on_delete=models.CASCADE 及连删除
# 博客
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
# 标题
headline = models.CharField(max_length=255)
# 文本
body_text = models.TextField()
# 作者
author = models.ManyToManyField(Author)
def __str__(self):
return self.body_text
# 条目详情
class EntryDetail(models.Model):
# 关联 Entry
entry = models.OneToOneField(Entry, on_delete=models.CASCADE)
# 详情
detail = models.TextField()
def __str__(self):
return self.detail
>>> from the_7.models import Blog,Author,Entry,EntryDetail
>>> q_ed = EntryDetail.objects.get(id=1)
>>> q_ed
<EntryDetail: 这里我省略了>
>>> q_ed.entry
<Entry: 多敲,多练,多思>
查看发往sql里的历史记录
>>> from django.db import connection
>>> connection.queries
[{'sql': "\n SELECT VERSION(),\n
@@sql_mode,\n @@default_storage_engine,\n @@sql_auto_is_null,\n
@@lower_case_table_names,\n CO
NVERT_TZ('2001-01-01 01:00:00', 'UTC', 'UTC') IS NOT NULL\n
", 'time': '0.047'}, {'sql': 'SET SESSION TRANSACTION I
SOLATION LEVEL READ COMMITTED', 'time': '0.000'}, {'sql': 'SELE
CT `the_7_entrydetail`.`id`, `the_7_entrydetail`.`entry_id`, `t
he_7_entrydetail`.`detail` FROM `the_7_entrydetail` WHERE `the_
7_entrydetail`.`id` = 1 LIMIT 21', 'time': '0.000'}, {'sql': 'S
ELECT `the_7_entry`.`id`, `the_7_entry`.`blog_id`, `the_7_entry
`.`headline`, `the_7_entry`.`body_text` FROM `the_7_entry` WHERE `the_7_entry`.`id` = 1 LIMIT 21', 'time': '0.000'}]
>>>
正向关联查询 —— 性能消耗低
>>> q_ed_author = EntryDetail.objects.select_related('entry').get(id=1)
>>> q_ed_author
<EntryDetail: 这里我省略了>
>>> q_ed_author.entry
<Entry: 多敲,多练,多思>
逆向查询
# 对象.属性 该属性就是模型关联表的类名的小写
>>> q_e = Entry.objects.get(id=1)
>>> q_e
<Entry: 多敲,多练,多思>
>>> q_e.entrydetail
<EntryDetail: 这里我省略了>
>>> q_e.entrydetail.detail
'这里我省略了'
>>>
一对多
正向关联查询
逆向查询
正向关联查询
>>> q_e = Entry.objects.get(id=1)
>>> q_e
<Entry: 多敲,多练,多思>
>>> q_e.blog
<Blog: python数据分析>
>>> q_e.body_text
'多敲,多练,多思'
>>> q_e.blog.name
'xiaoming'
>>>
逆向查询
# 对于每一个Blog的实例对象都会自动的有一个管理器来查询 与它关联的 entry 实例对象 在默认的情况下管理器的名字是` 小写的模型名_set`
>>> q_blog = Blog.objects.get(id=1)
>>> q_blog
<Blog: python数据库>
>>> q_blog.entry_set
<django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager object at 0x0000019E824347D0>
>>> q_blog.entry_set.all()
<QuerySet [<Entry: 记得多敲,多练,多思考>]>
>>>
多对多
正向查询
>>> from the_7.models import Blog,Author,Entry,EntryDetail
>>> q_e = Entry.objects.get(id=1)
>>> q_e
<Entry: 多敲,多练,多思>
>>> q_e.author
<django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x0000021590BB4990>
>>> q_e.author.all()
<QuerySet []>
逆向查询
>>> q_author = Author.objects.get(id=1)
>>> q_author
<Author: muyi>
>>> q_author.entry_set.all()
<QuerySet []>