Django Model基础 ORM

ORM

对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。

Django中的映射关系:

表名<------>类名

字段<------>属性

表记录<----->类实例对象

创建表(建立模型)

from django.db import models

analyse = '''
分析:
        一本书 可以由多个作者编著
        一本书只能由一个出版社出版
        一个作者可以写多本书
        每个作者有自己的简介
对应关系:
        Author-Book          -->  多对多
        Publish-Book         -->  一对多
        Author-AuhtorDetail  -->  一对一
如何创建:
        多对多:ManyToManyField
        一对多:ForeignKey
        一对一:OneToOneField
        创建一对多表的时候,ForeignKey建在多的那一方。另外两个随意建在哪一方。
'''


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


class Author(models.Model):
    # 作者
    name = models.CharField(max_length=32)
    age = models.IntegerField()


class AuhtorDetail(models.Model):
    # 作者简介
    addr = models.CharField(max_length=32)
    email = models.EmailField()
    author = models.OneToOneField('Author')


class Book(models.Model):
    # 书籍
    title = models.CharField(max_length=32)
    publishDate = models.DateField()
    price = models.DecimalField(max_digits=5, decimal_places=2)  # 最大 999.99
    publish = models.ForeignKey('Publish')  # 一对多
    authors = models.ManyToManyField('Author')  # 多对多

  

注意:建立一对多的关系时,外键字段建立在多的一方。建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表

当创建好model.py里面的类(也就是数据库中对应的表)之后,还需要输入以下两条命令来生成并更新表:

python manage.py makemigrations

python manage.py migrate

上面的命令执行成功后,表就创建出来了,此时表中还没有添加记录。

这些类实例化出来的对象就是对应数据库表中的一条记录。

通过配置settings.py文件的logging可以查看ORM操作运用的sql语句(下面的代码粘贴到settings.py里就行)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}  

字段选项

每个字段有一些特有的参数,例如,CharField需要max_length参数来指定VARCHAR数据库字段的大小。

常用通用参数:

null
如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.

blank
如果为True,该字段允许不填。默认为False。
要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。

default
字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。

primary_key
如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,
Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
否则没必要设置任何一个字段的primary_key=True。

unique
如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的

更多详见模型字段参考

添加表记录

普通字段

# 方式1
publish_obj=Publish(name="人民出版社",city="北京",email="renMin@163.com")
publish_obj.save() # 将数据保存到数据库

# 方式2 (也可以接收到一个返回值,是添加的记录对象)
Publish.objects.create(name="人民出版社",city="北京",email="renMin@163.com")
# 

# 方式3(了解,慎用,因为request里面还可能有表之外的其他内容)
Publish.objects.create(**request.POST.dict())

 ......

查询表记录

查询相关API

all():                 查询所有结果
 
filter(**kwargs):      它包含了与所给筛选条件相匹配的对象
 
get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
                       如果符合筛选条件的对象超过一个或者没有都会抛出错误。
 
exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象
 
values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                       model的实例化对象,而是一个可迭代的字典序列
 
values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
 
order_by(*field):      对查询结果排序
 
reverse():             对查询结果反向排序
 
distinct():            从返回结果中剔除重复纪录
 
count():               返回数据库中匹配查询(QuerySet)的对象数量。
 
first():               返回第一条记录
 
last():                返回最后一条记录
 
exists():              优化查询,如果QuerySet包含数据,就返回True,否则返回False

双下划线之单表查询

models.Tb1.objects.filter(id__gt=1, id__lt=10)   # 获取id大于1 且 小于10的值
 
models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
 
models.Tb1.objects.filter(name__contains="ven")  # 模糊查询类似mysql中的%like%
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
 
models.Tb1.objects.filter(id__range=[1, 2])      # 范围bettwen and,包含1跟2
 
startswith,istartswith, endswith, iendswith 

  ......

  

posted @ 2017-12-06 18:35  0bug  阅读(201)  评论(1)    收藏  举报