Django模型

2023-05-16

模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。通常,每个模型对应数据库中唯一的一张表

1.基础

  • 每个模型都是django.db.models.Model 的一个Python 子类。
  • 模型的每个属性都表示为数据库中的一个字段。
  • Django 提供一套自动生成的用于数据库访问的API;

2.简单例子 

  定义了一个UserMessage模型(相当于数据库中的一张表),它有5个属性(相当于数据库中的字段)。每个字段都被指定成一个类属性,每个属性映射到一个数据库的列。


class UserMessage(models.Model):
    # 自动生成一个ID主键
    object_id = models.CharField(max_length=20, primary_key=True, default='', verbose_name=u"主键")
    name = models.CharField(max_length=20,verbose_name=u"用户名")
    email = models.EmailField(verbose_name=u"邮箱")
    address = models.CharField(max_length=100,verbose_name=u"邮箱")
    message = models.CharField(max_length=500,verbose_name="留言")  

  上述创建过程,相当于数据创建表的过程,如下:


CREATE TABLE UserMessage (
     object_id INT(20)  PRIMARY KEY,
     name varchar(20) NOT NULL,
     email varchar(30) NOT NULL
     address varchar(100) NOT NULL
     email varchar(50) NOT NULL
);  

  注:如果没有定义主键,Django会默认生成一个id字段的作为主键。

3.使用模型

  定义好模型之后,接下来你需要告诉Django 使用这些模型。你要做的就是修改配置文件中的INSTALLED_APPS 设置,在其中添加models.py所在应用的名称。

  具体路径:settings--->INSTALLED_APPS------>'message'

  上述操作完成后,先执行manage.py makemigrations给应用生成迁移脚本,然后执行manage.py migrate。

  makemigrations 命令负责保存你的模型变化到一个迁移文件 - 和 commits很类似 - 同时 migrate负责将改变提交到数据库。

4.字段

  对于一个模型来说,最重要的和不可或缺的是列出该模型在数据库中定义的字段。字段由models类属性指定。要注意选择的字段名称不要和模型 API 冲突,比如cleansave 或者delete

  例如:


from django.db import models

class Musician(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    instrument = models.CharField(max_length=100)

class Album(models.Model):
    artist = models.ForeignKey(Musician)
    name = models.CharField(max_length=100)
    release_date = models.DateField()
    num_stars = models.IntegerField()  

5.字段类型

  模型中的每个字段都是 Field 子类的某个实例。Django 自带数十种内置的字段类型;

6.字段的自述名

  除ForeignKeyManyToManyField 和 OneToOneField 之外,每个字段类型都接受一个可选的位置参数(在第一的位置) —— 字段的自述名。如果没有给定自述名,Django 将根据字段的属性名称自动创建自述名 —— 将属性名称的下划线替换成空格。

  在这个例子中,自述名是 "person's first name":

first_name = models.CharField("person's first name", max_length=30)

  在这个例子中,自述名是  "first name"


first_name = models.CharField(max_length=30)  

  ForeignKeyManyToManyField 和 OneToOneField 都要求第一个参数是一个模型类,所以要使用 verbose_name 关键字参数才能指定自述名


poll = models.ForeignKey(Poll, verbose_name="the related poll")
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(Place, verbose_name="related place")  

7.关系

  Django 提供了三种最常见的数据库关系:多对一(many-to-one),多对多(many-to-many),一对一(one-to-one)。

  • 多对一关系

  Django 使用 django.db.models.ForeignKey 定义多对一关系。和使用其它字段类型一样:在模型当中把它做为一个类属性包含进来

  ForeignKey 需要一个位置参数:与该模型关联的类。

  比如,一辆汽车(Car)有一个制造商(Manufacturer) —— 但是一个制造商(Manufacturer) 生产很多汽车(Car),每一辆汽车(Car) 只能有一个制造商(Manufacturer) —— 使用下面的定义:


from django.db import models

class Manufacturer(models.Model):
    # ...
    pass

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer) # 一对多的关系,外键放在多的一方
    # ...                                  可以设置第二个参数verbose_name="related place"  

  多对一实例:


from django.db import models

class Reporter(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()

    def __str__(self):              # __unicode__ on Python 2
        return "%s %s" % (self.first_name, self.last_name)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    pub_date = models.DateField()
    reporter = models.ForeignKey(Reporter)

    def __str__(self):              # __unicode__ on Python 2
        return self.headline

    class Meta:
        ordering = ('headline',)  
View Code
  • 多对多关系 

  ManyToManyField 用来定义多对多关系,用法和其他Field 字段类型一样:在模型中做为一个类属性包含进来。

  ManyToManyField 需要一个位置参数:和该模型关联的类。

  例如,一个披萨可以有多种馅料 ,一种馅料 也可以位于多个披萨上。 如下展示:


from django.db import models

class Topping(models.Model):
    # ...
    pass

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)  

  建议你以被关联模型名称的复数形式做为ManyToManyField 的名字(例如上例中的toppings)。

  在哪个模型中设置 ManyToManyField 并不重要,在两个模型中任选一个即可 —— 不要两个模型都设置。

  应用实例:


from django.db import models

class Publication(models.Model):
    title = models.CharField(max_length=30)

    def __str__(self):              # __unicode__ on Python 2
        return self.title

    class Meta:
        ordering = ('title',)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication)

    def __str__(self):              # __unicode__ on Python 2
        return self.headline

    class Meta:
        ordering = ('headline',)  
View Code

  有些情况下,Django 允许你指定一个中介模型来定义多对多关系。 你可以将其他字段放在中介模型里面。源模型的ManyToManyField 字段将使用through 参数指向中介模型。对于上面的音乐小组的例子,代码如下:


from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)  

  在设置中介模型时,要显式地指定外键并关联到多对多关系涉及的模型。这个显式声明定义两个模型之间是如何关联的。

  中介模型有一些限制:

    • 中介模型必须有且只有一个外键到源模型(上面例子中的Group),或者你必须使用ManyToManyField.through_fields 显式指定Django 应该在关系中使用的外键。如果你的模型中存在不止一个外键,并且through_fields没有指定,将会触发一个无效的错误。 对目标模型的外键有相同的限制(上面例子中的 Person)。
    • 对于通过中介模型与自己进行多对多关联的模型,允许存在到同一个模型的两个外键,但它们将被当做多对多关联中一个关系的两边。如果有超过两个外键,同样你必须像上面一样指定through_fields,否则将引发一个验证错误。
    • 使用中介模型定义与自身的多对多关系时,你必须设置 symmetrical=False.
  •  一对一关系

  OneToOneField用来定义一对一关系。 用法和其他字段类型一样:在模型里面做为类属性包含进来。

  当某个对象想扩展自另一个对象时,最常用的方式就是在这个对象的主键上添加一对一关系。

  OneToOneField要一个位置参数:与模型关联的类。

8.字段名限制

  Django 对字段的命名只有两个限制:

    字段的名称不能是Python 保留的关键字,因为这将导致一个Python 语法错误。


class Example(models.Model):
    pass = models.IntegerField() # 'pass' is a reserved word!  

    由于Django 查询语法的工作方式,字段名称中连续的下划线不能超过一个。


class Example(models.Model):
    foo__bar = models.IntegerField() # 'foo__bar' has two underscores!  

9.Meta的使用


from django.db import models

class UserMessage(models.Model):
    # 自动生成一个ID主键
    object_id = models.CharField(max_length=20, primary_key=True, default='', verbose_name=u"主键")
    name = models.CharField(max_length=20,verbose_name=u"用户名")
    email = models.EmailField(verbose_name=u"邮箱")
    address = models.CharField(max_length=100,verbose_name=u"邮箱")
    message = models.CharField(max_length=500,verbose_name="留言")

    class Meta: # 元信息使用
        verbose_name = u"用户留言信息"
        ordering = ["name"]  # 按照名字排序
        db_table = "userinfo"  

  模型元数据是“任何不是字段的数据”,比如排序选项(ordering),数据库表名(db_table)或者人类可读的单复数名称(verbose_name 和verbose_name_plural)。在模型中添加class Meta是完全可选的,所有选项都不是必须的。

  模型元


 abstract = True, 就表示模型是 抽象基类 (abstract base class)

db_table = 'music_album'  数据表的名称,在 MySQL中使用小写字母为表命名

ordering = ['-order_date'] 每个字符串是一个字段名,前面带有可选的“-”前缀表示倒序。前面没有“-”的字段表示正序。使用"?"来表示随机排序。
    ordering = ['pub_date'] 正序排序
    ordering = ['-pub_date'] 倒序排序
    ordering = ['-pub_date', 'author'] 先按照pub_date的倒序排序,再按照 author 的正序排序
    verbose_name = "pizza" 对象的一个易于理解的名称,为单数;如果此项没有设置,Django会把类名拆分开来作为自述名,比如CamelCase 会变成camel case
    verbose_name_plural = "stories" 对象复数形式的名称;如果此项没有设置,Django 会使用 verbose_name + "s" 
View Code

10.模型的方法 

  可以在模型上定义自定义的方法来给你的对象添加自定义的“底层”功能。Manager 方法用于“表范围”的事务,模型的方法应该着眼于特定的模型实例。

  这是一个非常有价值的技术,让业务逻辑位于同一个地方 —— 模型中。

  例如,下面的模型具有一些自定义的方法:


from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birth_date = models.DateField()

    def baby_boomer_status(self):
        "Returns the person's baby-boomer status."
        import datetime
        if self.birth_date < datetime.date(1945, 8, 1):
            return "Pre-boomer"
        elif self.birth_date < datetime.date(1965, 1, 1):
            return "Baby boomer"
        else:
            return "Post-boomer"

    def _get_full_name(self):
        "Returns the person's full name."
        return '%s %s' % (self.first_name, self.last_name)
    full_name = property(_get_full_name)  

  

更多相关信息参考:http://python.usyiyi.cn/translate/django_182/topics/db/models.html

转载于:https://www.cnblogs.com/vipchenwei/p/7275846.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django模型 的相关文章

随机推荐

  • 高性能异步爬虫

    背景 其实爬虫的本质就是client发请求批量获取server的响应数据 xff0c 如果我们有多个url待爬取 xff0c 只用一个线程且采用串行的方式执行 xff0c 那只能等待爬取一个结束后才能继续下一个 xff0c 效率会非常低 需
  • [operator]deepin 卸载自带搜狗输入法后,输入法消失

    解决这个问题我先是升级了官方的im config套件 xff0c 升级后发现并没有什么用 xff0c 然后使用以下方式 xff0c 做个记录 命令行操作 删除搜狗的残留文件 cd config rm rf SogouPY users rm
  • DPK

    一 概念 dpk文件是Delphi的包文件 xff0c 有dpk文件的组件安装比较方便 一般来说 xff0c 支持不同版本Delphi的组件会有不同的dpk文件 xff0c 一般以7结尾的dpk文件是支持Delphi 7的 如果没有支持De
  • free -g 说明

    free g 说明 xff1a free g 43 buffers cache 说明 xff1a buffer 写缓存 xff0c 表示脏数据写入磁盘之前缓存一段时间 xff0c 可以释放 sync命令可以把buffer强制写入硬盘 cac
  • Google Drive 里的文件下载的方法

    Google Drive 里并不提供创建直接下载链接的选项 xff0c 但是可以通过小小的更改链接形式就能把分享的内容保存到本地 例如 xff0c 一份通过 Google Drive 分享的文件链接形式为 xff1a https drive
  • 关于虚拟机VMware Tools安装中出现的无法自动安装VMCI驱动程序的问题

    问题 解决方法 根据配置文件信息找到所在的虚拟机位置 找到后缀名为vmx的文件 xff0c 右键打开方式中选择使用记事本打开 选择左上角编辑中的查找功能输入图中的查找内容后 xff0c 点击查找下一个 将其原先的TRUE值改为false即可
  • 服务器系统运行内存,服务器系统运行内存使用情况

    服务器系统运行内存使用情况 内容精选 换一换 包年 包月的计费模式也称为包周期计费模式 xff0c 是一种预付费方式 xff0c 按订单的购买周期计费 xff0c 适用于可预估资源使用周期的场景 xff0c 价格比按需计费模式更优惠 包年
  • Ubuntu 18.04 上使用xrdp远程桌面登录蓝屏解决

    所有工具方法来自 http c nergy be blog p 61 13663 免责声明 xff1a 像往常一样 xff0c 使用此风险自负 xff01 本地有台机器装了乌班图18 04版本系统 我们想远程图形化访问它 我第一想法是xrd
  • Go——习惯用法

    1 干净与强迫症 Go在代码干净上有了近乎苛刻的要求 xff0c 主要体现在如下几个方面 xff1a 编译器不能通过未使用的局部变量 xff08 包括未使用的标签 xff09 import 未使用的包同样通不过编译 所有的控制结构 函数和方
  • snprintf()函数使用方法

    众所周知 sprintf不能检查目标字符串的长度 xff0c 可能造成众多安全问题 所以都会推荐使用snprintf 自从snprintf代替了sprintf xff0c 相信大家对snprintf的使用都不会少 xff0c 函数定义如下
  • Openwrt无线中继设置并访问外网

    Openwrt无线中继设置并访问外网 本篇博文参考来自 xff1a http blog csdn net pifangsione article details 13162023 配置目标 主路由器使用AP模式发射Wifi从路由器使用Cli
  • 在 Windows 7 中禁用IPv6协议/IPv6隧道

    How to disable certain Internet Protocol version 6 IPv6 components in Windows Vista Windows 7 and Windows Server 2008 ht
  • python matplotlib绘图大全(散点图、柱状图、饼图、极坐标图、热量图、三维图以及热图)...

    2019 7 14晚 matplotlib七种常见图像输出编程大全 七种图形汇总输出如下 xff1a import numpy as np 导入数据结构nmupy模块 import matplotlib pyplot as plt 导入ma
  • 光纤模式分布 matlab,matlab计算单模光纤模式分布(公布源代码及参考文献)

    最近在使用matlab计算单模光纤纤芯模及包层模模场分布时 xff0c 有一些问题一直悬而未决 xff0c 多次咨询原作者后虽解决了部分问题 xff0c 但是余下的问题原作者也不理我了 xff0c 特发此贴以广交学习光纤方面的同学 老师及科
  • Ubuntu下编译安装MySQL5.7

    tar zxvf mysql 5 7 14 tar gz cd mysql 5 7 14 第一步 xff1a cmake DCMAKE INSTALL PREFIX 61 usr local mysql DMYSQL DATADIR 61
  • UNICODE使用的一些知识和技巧

    UNICODE宏和 UNICODE宏的关系 在windows编程中 经常要编译Unicode版本的程序 方法是工程文件的配置中加上UNICODE或者 UNICODE编译条件 那么到底是用哪一个呢 Jeffrey Richter在 Windo
  • cmake 常用命令

    1 使用日期 获取时间 string TIMESTAMP DATE TIME 34 y m d H M 34 获取日期 string TIMESTAMP DATE VERSION 34 m d 34 转载于 https www cnblog
  • QQ2008 msg.db,user.db读取

    Saturday November 27 2010 msg db读取 下载 user db读取 下载 转载于 https www cnblogs com ycdx2001 archive 2010 11 27 1889498 html
  • MongoDB——Mac环境搭建

    1 下载 官网地址 xff1a https www mongodb com 2 解压并配置 解压到 usr local 配置Path xff0c vim打开 bash profile添加export PATH 61 PATH usr loc
  • Django模型

    模型是你的数据的唯一的 权威的信息源 它包含你所储存数据的必要字段和行为 通常 xff0c 每个模型对应数据库中唯一的一张表 1 基础 每个模型都是django db models Model 的一个Python 子类 模型的每个属性都表示