python的ORM(对象关系映射)

定义

用面向对象的方式去操作数据库的创建表以及增删改查等操作。

作用

用创建的类来实现对应slq的语句,ORM使得我们的通用数据库交互变得简单易行。
缺点:性能有所牺牲

字段

字段:在数据库中,大多数时,表的“列”称为“字段” ,每个字段包含某一专题的信息。就像“通讯录”数据库中,“姓名”、“联系电话”这些都是表中所有行共有的属性,所以把这些列称为“姓名”字段和“联系电话”字段。
CharField
#字符串字段, 用于较短的字符串.
IntegerField
#用于保存一个整数.

分类

一对一
一对多
多对多

创建单表

from django.db import models
class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)

    def __str__(self):
        return self.name

创建关联表

#一对多(ForeignKey):

    #方式一: 由于绑定一对多的字段,比如publish,存到数据库中的字段名叫publish_id,所以我们可以直接给这个
    #       字段设定对应值:
           Book.objects.create(title='php',
                               publisher_id=2,   #这里的2是指为该book对象绑定了Publisher表中id=2的行对象
                               publication_date='2017-7-7',
                               price=99)


    #方式二:
    #       <1> 先获取要绑定的Publisher对象:
        pub_obj=Publisher(name='河大出版社',address='保定',city='保定',
                state_province='河北',country='China',website='http://www.hbu.com')
    OR  pub_obj=Publisher.objects.get(id=1)

    #       <2>将 publisher_id=2 改为  publisher=pub_obj

#多对多(ManyToManyField()):

    author1=Author.objects.get(id=1)
    author2=Author.objects.filter(name='alvin')[0]
    book=Book.objects.get(id=1)
    book.authors.add(author1,author2)
    #等同于:
    book.authors.add(*[author1,author2])
    book.authors.remove(*[author1,author2])
    #-------------------
    book=models.Book.objects.filter(id__gt=1)
    authors=models.Author.objects.filter(id=1)[0]
    authors.book_set.add(*book)
    authors.book_set.remove(*book)
    #-------------------
    book.authors.add(1)
    book.authors.remove(1)
    authors.book_set.add(1)
    authors.book_set.remove(1)

#注意: 如果第三张表是通过models.ManyToManyField()自动创建的,那么绑定关系只有上面一种方式
#     如果第三张表是自己创建的:
     class Book2Author(models.Model):
            author=models.ForeignKey("Author")
            Book=  models.ForeignKey("Book")
#     那么就还有一种方式:
            author_obj=models.Author.objects.filter(id=2)[0]
            book_obj  =models.Book.objects.filter(id=3)[0]

            s=models.Book2Author.objects.create(author_id=1,Book_id=2)
            s.save()
            s=models.Book2Author(author=author_obj,Book_id=1)
            s.save()

初始化数据库

记得在settings里的INSTALLED_APPS中加入’应用名称’,然后再同步数据库。

  1. python manage.py makemigrations
  2. python manage.py migrate

单表的增删改查

  1. 增(create , save)
from app01.models import *

    #create方式一:   Author.objects.create(name='Arthur')

    #create方式二:   Author.objects.create(**{"name":"Arthur"})  #插入

    #save方式一:     author=Author(name="Arthur")
                    author.save()

    #save方式二:     author=Author()
                    author.name="Arthur"
                    author.save()
  1. 删(delete)
book.objects.filter(id=1).delete()
  1. 改(update和save)
book.objects.filter(id=1).update()  #推荐用
 obj=models.Book.objects.filter(id=3)[0]   #save方法会将所有属性重新设定一遍,效率低
    obj.title="Python" 
    obj.save()

#  <1>filter(**kwargs):      它包含了与所给筛选条件相匹配的对象

#  <2>all():                 查询所有结果

#  <3>get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

_str_ 方法

不要打印内存地址,而打印内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值