表关系操作

定义模型

创建数据

博客  和  条目   一对多
条目  和  作者       多对多
条目  和  条目详情   一对一

一对一

一对多

多对多

定义模型

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值