代码改变世界

ORM对象关系型映射的用法

2019-01-05 17:59  那个杰克  阅读(468)  评论(0编辑  收藏  举报

ORM对象关系型映射的用法 -- Django模型

1.什么是ORM关系型映射

ORM 全拼Object-Relation Mapping.
中文意为 对象-关系映射.
主要实现模型对象到关系数据库数据的映射.

2.Django数据类型

类型 说明
AutoField 用于存放integer类型的数字
BooleanField 用于存放布尔类型的数据(Ture或False)
CharField 用于存放字符型的数据,需要指定长度max_length
CommaSeparatedIntegerField 用于存放用逗号隔开的 integer 类型的数据
DateField 日期型,必须是“YYYY-MM-DD”格式
DateTimeField 日期时间型,必须是"YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] "格式。
DecimalField 小数型,用于存放小数的数字。
EmailField 电子邮件类型
FilePathField 文件路径类类型,FilePathFields must have either 'allow_files' or 'allow_folders' set to True.
FloatField 浮点型。用于存放浮点型数据。
IntegerField 用于存放 integer 类型的数字。
BigIntegerField 用于存放大 integer 类型的数字,最大数支持:9223372036854775807
GenericIPAddressField 存放 IP 地址的类型,IPv4 和 IPv6 地址,字符串格式。
NullBooleanField vlaue must be either None, True or False.
PositiveSmallIntegerField Positive small integer
SlugField 需要定义 max_length 值。
SmallIntegerField Small integer
TextField 用于存放文本类型的数据。
TimeField 时间类型。"HH:MM[:ss[.uuuuuu]]" 格式
URLField 用于存放 URL 地址
BinaryField Raw binary data

3.Django模型中设计系统表

from django.db import models

# Create your models here.
class Event(models.Model):
    """活动表"""
    name = models.CharField("发布会名称",max_length=100) #发布会名称
    limit = models.IntegerField("参加人数") #人数
    status = models.BooleanField("状态",default=True) #活动开始状态
    address = models.CharField("地址",max_length=100) #地址
    start_time = models.DateTimeField("时间") #活动开始时间
    create_time = models.DateTimeField(auto_now_add=True) #创建时间

    def __str__(self):
        return self.name


class Guest(models.Model):
    """嘉宾表"""

    event = models.ForeignKey(Event,on_delete=models.Case) #嘉宾与活动关联
    real_name = models.CharField("姓名",max_length=64) #真实姓名
    phone = models.CharField("手机号",max_length=16) #手机号
    email = models.EmailField("邮箱") #邮箱
    sign = models.BooleanField("签到") #签到
    create_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.real_name

4.迁移数据库

> python manage.py makemigrations
> python manage.py migrate
> 注册后台admin用户
> python manage.py createsuperuser

5.admin后台管理/自定义后台

#在admin.py中完成模型的注册

from django.contrib import admin
from model_app.models import Event,Guest
# Register your models here.

class EventAdmin(admin.ModelAdmin):
    """显示出Event数据的字段"""
    list_display = ['name','limit','status','address','start_time']

class GuestAdmin(admin.ModelAdmin):
    """显示出Guest数据的字段"""
    list_display = ['real_name','phone','email','sign']

admin.site.register(Event,EventAdmin)
admin.site.register(Guest,GuestAdmin)

6.ORM基本数据访问

D:\pydj\guest> python3 manage.py shell 模式下进行

6.1 查询数据
  • 根据主键查询数据

e1 = Event.objects.get()

有局限性:

1.数据库中存在多个数据时,会报错
2.数据库中不存在时数据时,会报错

用法: 用户根据主键查询
e1 = Event.objects.get(id=1)

  • 类似where查询

e1 = Event.objects.filter()

  • 模糊查询

e1 = Event.objects.filter(name__contains="python")

6.2 插入数据

  • 方式一

e1 = Event(id=2,name='朋友',limit=2000,status=True,address='北京水立方',start_time=datetime(2016,8,10,14,0,0))
e1.save

  • 方式二

Event.objects.create(id=2,name='朋友',limit=2000,status=True,address='北京水立方',start_time=datetime(2016,8,10,14,0,0))

6.3 删除数据

  • 先查出数据,后删除

e1 = Event.objects.get(id=1)
e1.delete()
或者 Event.objects.get(id=1).delete()

6.4 更新数据

  • 方式一 查询出数据,后根据字段进行更新 例如:查询phone='13611001101' 的嘉宾,更新 realname='andy2''

e1 = Event.objects.get(phone='13611001101')
e1.realname = 'andy2'
e1.save()

  • 方法二

Event.objects.select_for_update().filter(phone='13611001101').update(realname='andy')