Modèle
C'est le 4e jour de ma participation au défi de mise à jour d'août. Pour plus de détails sur l'événement, veuillez consulter : Défi de mise à jour d'août
Les modèles sont la source unique et non ambiguë d'informations sur vos données. Il contient les champs de base et le comportement des données que vous stockez. En règle générale, chaque modèle correspond à une seule table de base de données.
Notions de base:
- Chaque modèle est une classe Python qui étend django.db.models.Model.
- Chaque propriété du modèle représente un champ de base de données.
1. Exemple
Cet exemple de modèle en définit un Person
, qui a une first_name
sommelast_name
:
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
复制代码
first_name
et sont les champslast_name
du modèle . Chaque champ est spécifié en tant qu'attribut de classe et chaque attribut correspond à une colonne de base de données.
Le Person
modèle ci-dessus créera une table de base de données comme celle-ci :
CREATE TABLE app_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
复制代码
illustrer:
-
Un app_person (nom d'application enregistré par vous-même) sera généré dans la base de données, et ce nom de base de données peut être remplacé par db_table
-
db_table = 'test_person' 复制代码
-
-
Nous n'avons pas créé de champ d'identifiant, mais il sera ajouté par défaut pour nous, mais cet identifiant peut également être remplacé
-
id = models.BigAutoField(primary_key=True) 复制代码
-
2. Utilisez le modèle
Après avoir défini la classe de modèle, nous devons la migrer vers la base de données
python manage.py makemigrations # 生成迁移文件,都放在migrations中,
python manage.py migrate # 迁移,迁移成功会在数据库中有记录
复制代码
Remarquer:
Si nous n'enregistrons pas INSTALLED_APPS dans settings.py, il ne sera pas migré. N'oubliez pas d'utiliser
INSTALLED_APPS = [
...
'app', # 自己使用startapp注册的
...
]
复制代码
3. Type de champ
Le tableau suivant répertorie tous les types de champs intégrés à Django, à l'exception des types de champs relationnels (les noms de champs sont en casse camel, veillez donc à faire attention aux débutants) :
taper | illustrer |
---|---|
Champ automatique | Un champ de type entier auto-incrémenté. Habituellement, vous n'avez pas besoin de l'écrire vous-même, Django ajoutera automatiquement des champs pour vous : id = models.AutoField(primary_key=True) , qui est un champ auto-incrémenté, à partir de 1. Si vous devez définir vous-même la clé primaire, veillez à définir le champ sur primary_key=True . Django n'autorise qu'un seul champ d'auto-incrémentation dans un modèle, et ce champ doit être la clé primaire ! |
GrandChampAuto | Champ d'auto-incrémentation de type entier 64 bits, la plage de nombres est plus grande, de 1 à 9223372036854775807 |
GrandChampEntier | 64位整数字段(看清楚,非自增),类似IntegerField ,-9223372036854775808 到9223372036854775807。在Django的模板表单里体现为一个NumberInput 标签。 |
BinaryField | 存储原始二进制数据的字段。 |
BooleanField | 布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签。如果设置了参数null=True,则表现为NullBooleanSelect选择框。可以提供default参数值,设置默认值。 |
CharField | 最常用的类型,字符串类型。必须接收一个max_length参数,表示字符串长度不能超过该值。默认的表单标签是text input。 |
DateField | auto_now:保存对象时自动将字段设置为现在(当前时间) auto_now_add:首次创建对象时自动将字段设置为现在。用于创建时间戳 |
DateTimeField | 日期和时间,在 Python 中由datetime.datetime 实例表示。 |
DecimalField | 一个固定精度的十进制数,在 Python 中由一个 Decimal 实例表示。有两个必需的参数 |
DurationField | 用于存储时间段的字段 |
EmailField | 使用CharField 来检查该值是否为有效电子邮件地址 |
FileField | 文件上传字段。 |
FilePathField | 文件路径类型,后面单独介绍 |
FloatField | 浮点数类型,对应Python的float。参考整数类型字段。 |
ImageField | 图像类型,后面单独介绍。 |
IntegerField | 整数类型,最常用的字段之一。取值范围-2147483648到2147483647。在HTML中表现为NumberInput或者TextInput标签。 |
GenericIPAddressField | class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options) ,IPV4或者IPV6地址,字符串形式,例如192.0.2.30 或者2a02:42fe::4 。在HTML中表现为TextInput标签。参数protocol 默认值为‘both’,可选‘IPv4’或者‘IPv6’,表示你的IP地址类型。 |
JSONField | JSON类型字段。Django3.1新增。签名为class JSONField(encoder=None,decoder=None,**options) 。其中的encoder和decoder为可选的编码器和解码器,用于自定义编码和解码方式。如果为该字段提供default值,请务必保证该值是个不可变的对象,比如字符串对象。 |
PositiveBigIntegerField | 正的大整数,0到9223372036854775807 |
PositiveIntegerField | 正整数,从0到2147483647 |
PositiveSmallIntegerField | 较小的正整数,从0到32767 |
SlugField | slug是一个新闻行业的术语。一个slug就是一个某种东西的简短标签,包含字母、数字、下划线或者连接线,通常用于URLs中。可以设置max_length参数,默认为50。 |
SmallAutoField | Django3.0新增。类似AutoField,但是只允许1到32767。 |
SmallIntegerField | 小整数,包含-32768到32767。 |
TextField | 用于储存大量的文本内容,在HTML中表现为Textarea标签,最常用的字段类型之一!如果你为它设置一个max_length参数,那么在前端页面中会受到输入字符数量限制,然而在模型和数据库层面却不受影响。只有CharField才能同时作用于两者。 |
TimeField | 时间字段,Python中datetime.time的实例。接收同DateField一样的参数,只作用于小时、分和秒。 |
URLField | 一个用于保存URL地址的字符串类型,默认最大长度200。 |
UUIDField | 用于保存通用唯一识别码(Universally Unique Identifier)的字段。使用Python的UUID类。在PostgreSQL数据库中保存为uuid类型,其它数据库中为char(32)。这个字段是自增主键的最佳替代品,后面有例子展示。 |
4.关系字段
ForeignKey | 一对多 |
---|---|
OneToOneField | 一对一 |
ManyToManyField | 多对多 |
5.字段选项
null | 如果True,可以存储空值。默认为False。 |
---|---|
blank | 如果True,则允许该字段为空。默认为False(True表单验证将允许输入空值) |
choices | CHOICES = [ ('SR', 'Senior'), ('GR', 'Graduate'), ] 每个元组中的第一个元素是要在模型上设置的实际值,第二个元素是可读的名称 |
db_column | 用于此字段的数据库列的名称。如果没有给出, 将使用该字段的名称。 |
db_index | 如果True ,将为此字段创建数据库索引。 |
db_tablespace | 用于此字段索引的[数据库表空间的名称(如果此字段已编入索引)。默认值是项目的 `DEFAULT_INDEX_TABLESPACE设置(如果已设置)或 db_tablespace模型的设置(如果有)。如果后端不支持索引表空间,则忽略此选项。 |
default | 字段的默认值 |
editable | 如果是False ,该字段将不会 ModelForm中。在模型验证期间它们也会被跳过。默认为True 。 |
error_messages | 该error_messages 参数允许您覆盖该字段将引发的错误默认消息 |
Texte d'aide | Texte "d'aide" supplémentaire à afficher avec les widgets de formulaire. Même si votre champ n'est pas utilisé sur le formulaire, il peut être utilisé sur le document. |
clé primaire | Si True , alors le champ est la clé primaire du modèle |
unique | Si True , le champ doit être unique dans la table. |
nom_verbeux | Nom lisible du champ. Si aucun nom détaillé n'est donné, Django le créera automatiquement en utilisant le nom d'attribut du champ, en convertissant les traits de soulignement en espaces |
\