models

文档版本

Documentation version: 1.10

简单实例

定义

from django.db import models

class Fruit(models.Model):
    name = models.CharField(max_length=100, primary_key=True)

使用

>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
['Apple', 'Pear']

主键

获取所有项

删除所有

关系(Relationships)

多对一关系(Many-to-one relationships)

  • 使用django.db.models.ForeignKey定义多对一关系

示例

一辆车(Car)对应多个制造商(Manufacturer )

  • 定义递归关联(对象关联自身)

  • 使用未定义的Model

  • 建议使用模型名称单数形式作为成员变量(如上例中的变量manufacturer)

多对多关系(Many-to-many relationships)

  • 使用ManyToManyField定义多对多关系

判断存不存在

添加

示例

一个Pizza(披萨)有多个Topping(配料), 一个Topping可以在多个Pizza上.

  • 可以像多对一关系一样定义递归关联和使用未定义模型

  • 建议使用模型名称复数形式作为成员变量(如上例中的变量toppings)

  • 多对多关系只能在两个相关模型中的一个内定义, 在哪一个里面定义无所谓

  • 通常, 多对多字段(ManyToManyField)应该定义在将要被修改的表格中. 上例中, 在Pizza中定义Topping(配料), 因为相比认为配料在多个披萨里面, 披萨里面有多种配料更容易理解. 按照上例中多对多字段的定义方式, Pizza表可以让用户选择多种配料(而不是配料中选披萨).

另一个示例

文章和出版商.

  • 注意: 如果使用模型中间件来定义多对多关系, 可能会禁用一些相关的管理方法, 以至于下面的示例可能无法工作

  • 创建几个Publications

  • 创建一个Article

  • 与保存之前无法和Publication关联

  • 保存

  • 添加关联

  • 重新创建一个Article并和多个Publication关联

  • 重复添加也没问题

  • 如果添加的对象类型不正确, 会抛出TypeError异常

  • 一步完成创建Article并添加Publication

  • Article对象可以访问相关联的Publication

  • Publication对象也可以访问相关联的Article对象

  • 多对多关系可以通过使用跨关系查找(lookups across relationships)查询

  • count()distinct()方法

  • 支持反向多对多查询

  • 执行一个关联工作是非常简单的

  • 如果我们删除了一个Publication, 它关联的Articles将不能再访问它

  • 如果我们删除了一个Article, 它关联的Publications将不能再访问它

  • 添加关系

  • 从Publication中移除Article

    也可以通过在Article中移除Publication

  • 关系集合可以被设置

  • 关系集合可以被清空

    或者从关联的对象清空:

  • 批量删除Publications

  • 批量删除Articles

多对多关系额外字段

Migrations

生成变更

python manage.py makemigrations

应用变更

字段

datetimefield

user migrations位置

验证字段

自定义验证函数

参考一

问题: 将model写在不同文件及文件夹下, 无法生成数据表

Django会搜索所有继承django.db.models.Model的类, 并生成相应的数据表,如果没能正常生成, 可能的原因:

  • 定义model的源文件的路径中有文件夹下不包含__init__.py, 这样python不会把该文件夹当作package

最后更新于

这有帮助吗?