模型(Models)是应用程序的数据访问层。默认情况下,每个django应用程序都会获取一个 models.py 文件来创建数据库表。 django框架中的默认数据库引擎是 sqlite3 。可以通过访问项目目录下的 settings.py 进行更改。 Django使用ORM(对象关系映射),使无涯教程能够执行数据库操作而无需编写SQL查询,而是使用简单的python对象。
from django.db import models
模型(models)是一个包含模型类,不同模型字段和字段关系的定义的模块。 要创建表,只需使一个类成为 Model 类的子类即可。
class MyClassname(models.Model):
...
模型字段
Django 2.2版提供26种不同的字段类型以捕获不同的数据格式。为简单起见根据函数而不是按字母顺序对它们进行了分组。
字段类型
- AutoField
- BigAutoField
- UUIDField
- IntegerField
- PositiveIntegerField
- SmallIntegerField
- PositiveSmallIntegerField
- BigIntegerField
- DecimalField
- FloatField
- BinaryField
- BooleanField
- NullBooleanField
- CharField
- TextField
- EmailField
- SlugField
- URLField
- GenericIPAddressField
- DateField
- TimeField
- DateTimeField
- DurationField
- FileField
- FilePathField
- ImageField
字段选项
Django字段类型中提供以下参数:
- null
- blank
- choices
- db_column
- db_index
- db_tablespace
- default
- editable
- error_messages
- help_text
- primary_key
- unique
- unique_for_date
- unique_for_month
- unique_for_year
- verbose_name
- validators
字段关系
有时,业务逻辑需要不同模型类的属性之间的关系。在Django模型中,它们是三个字段关系: ForeignKey(), OneToOneField()和 ManyToManyField()。
Django外键
ForeignKey就像一对多的关系。它需要两个位置参数,即 Classname 和 on_delete 。 类名是与模型相关的类。 on_delete = models.CASCADE 意味着删除Super类对象时,其所有反射也将被删除,因为ForeignKey也将被删除。例如,当删除以下模型中的Customer对象时,其相关的Order对象也将被删除。
class Customer(models.Model):
name = models.CharField(max_length=30)
def __str__(self):
return self.name
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Order</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
customer </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">ForeignKey</span><span class="pun">(</span><span class="typ">Customer</span><span class="pun">,</span><span class="pln"> on_delete</span><span class="pun">=</span><span class="pln">models</span><span class="pun">.</span><span class="pln">CASCADE</span><span class="pun">)</span><span class="pln">
order_details </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">TextField</span><span class="pun">()</span><span class="pln">
</span></pre>
Django OneToOneField 一对一
OneToOneField 与ForeignKey非常相似,不同的是,其外观类似于 unique = True 。
例如,如果一个人只能拥有一个国籍,则可以描述如下:
class Person(models.Model):
name = models.CharField(max_length=30)
def __str__(self):
return self.name
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Citizenship</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
person </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">OneToOneKey</span><span class="pun">(</span><span class="typ">Person</span><span class="pun">,</span><span class="pln"> on_delete</span><span class="pun">=</span><span class="pln">models</span><span class="pun">.</span><span class="pln">CASCADE</span><span class="pun">)</span><span class="pln">
country </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">CharField</span><span class="pun">(</span><span class="pln">max_length</span><span class="pun">=</span><span class="lit">30</span><span class="pun">)</span><span class="pln">
</span></pre>
Django ManyToManyField 多对多
多对多关系仅需要一个参数,即与模型相关的类。用下面的例子可以理解:
class Person(models.Model):
name = models.CharField(max_length=30)
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Group</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
name </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">CharField</span><span class="pun">(</span><span class="pln">max_length</span><span class="pun">=</span><span class="lit">128</span><span class="pun">)</span><span class="pln">
members </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">ManyToManyField</span><span class="pun">(</span><span class="pln">
</span><span class="typ">Person</span><span class="pun">,</span><span class="pln">
through</span><span class="pun">=</span><span class="str">Membership</span><span class="pun">,</span><span class="pln">
through_fields</span><span class="pun">=(</span><span class="str">group</span><span class="pun">,</span><span class="pln"> </span><span class="str">person</span><span class="pun">),</span><span class="pln">
</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Membership</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
</span><span class="kwd">group</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">ForeignKey</span><span class="pun">(</span><span class="typ">Group</span><span class="pun">,</span><span class="pln"> on_delete</span><span class="pun">=</span><span class="pln">models</span><span class="pun">.</span><span class="pln">CASCADE</span><span class="pun">)</span><span class="pln">
person </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">ForeignKey</span><span class="pun">(</span><span class="typ">Person</span><span class="pun">,</span><span class="pln"> on_delete</span><span class="pun">=</span><span class="pln">models</span><span class="pun">.</span><span class="pln">CASCADE</span><span class="pun">)</span><span class="pln">
inviter </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">ForeignKey</span><span class="pun">(</span><span class="pln">
</span><span class="typ">Person</span><span class="pun">,</span><span class="pln">
on_delete</span><span class="pun">=</span><span class="pln">models</span><span class="pun">.</span><span class="pln">CASCADE</span><span class="pun">,</span><span class="pln">
related_name</span><span class="pun">=</span><span class="str">"membership_invites"</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span><span class="pln">
invite_reason </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">CharField</span><span class="pun">(</span><span class="pln">max_length</span><span class="pun">=</span><span class="lit">64</span><span class="pun">)</span><span class="pln">
</span></pre>
参考链接