| 1 |
================================= |
|---|
| 2 |
Document de référence des modÚles |
|---|
| 3 |
================================= |
|---|
| 4 |
|
|---|
| 5 |
Un modÚle est une description unique et définitive de vos données. Il contient |
|---|
| 6 |
les champs et comportements essentiels des données que vous stockez. |
|---|
| 7 |
Généralement, chaque modÚle correspond à une seule table de base de données. |
|---|
| 8 |
|
|---|
| 9 |
Les bases: |
|---|
| 10 |
|
|---|
| 11 |
* Chaque modÚle est une classe Python qui étend ``django.db.models.Model``. |
|---|
| 12 |
* Chaque attribut du modÚle représente un champ de base de données. |
|---|
| 13 |
* Les méta-données du modÚle (informations n'étant pas des champs) vont dans |
|---|
| 14 |
une classe interne nommée ``Meta``. |
|---|
| 15 |
* Les méta-données utilisées pour le site d'administration de Django vont |
|---|
| 16 |
dans une classe interne nommée ``Admin``. |
|---|
| 17 |
* Avec tout cela, Django vous donne une API d'accÚs à la base de données |
|---|
| 18 |
générée automatiquement, qui est décrite dans la `Documentation de |
|---|
| 19 |
référence pour l'API de base de données`_. |
|---|
| 20 |
|
|---|
| 21 |
Pour accompagner ce document, n'hésitez pas à jeter un Åil au `dépÃŽt officiel |
|---|
| 22 |
des exemples de modÚle`_. |
|---|
| 23 |
(Dans le paquetage des sources de Django, ces exemples sont dans le répertoire |
|---|
| 24 |
``tests/modeltests``.) |
|---|
| 25 |
|
|---|
| 26 |
.. _Documentation de référence pour l'API de base de données: |
|---|
| 27 |
../db_api/ |
|---|
| 28 |
.. _dépÎt officiel des exemples de modÚle: |
|---|
| 29 |
../models/ |
|---|
| 30 |
|
|---|
| 31 |
Exemple rapide |
|---|
| 32 |
============== |
|---|
| 33 |
|
|---|
| 34 |
Ce modÚle d'exemple définit une ``Personne``, qui possÚde un ``prenom`` et un |
|---|
| 35 |
``nom``:: |
|---|
| 36 |
|
|---|
| 37 |
from django.db import models |
|---|
| 38 |
|
|---|
| 39 |
class Personne(models.Model): |
|---|
| 40 |
prenom = models.CharField(maxlength=30) |
|---|
| 41 |
nom = models.CharField(maxlength=30) |
|---|
| 42 |
|
|---|
| 43 |
``prenom`` et ``nom`` sont des *champs* du modÚle. Chaque champ est déclaré |
|---|
| 44 |
comme un attribut de classe, et chaque attribut correspond à une colonne de base |
|---|
| 45 |
de données. |
|---|
| 46 |
|
|---|
| 47 |
Le modÚle ``Personne`` ci-dessus créerait une table de base de données comme |
|---|
| 48 |
celle-ci:: |
|---|
| 49 |
|
|---|
| 50 |
CREATE TABLE monappli_personne ( |
|---|
| 51 |
"id" serial NOT NULL PRIMARY KEY, |
|---|
| 52 |
"prenom" varchar(30) NOT NULL, |
|---|
| 53 |
"nom" varchar(30) NOT NULL |
|---|
| 54 |
); |
|---|
| 55 |
|
|---|
| 56 |
Quelques notes techniques: |
|---|
| 57 |
|
|---|
| 58 |
* Le nom de la table, ``monappli_personne``, est automatiquement dérivé de |
|---|
| 59 |
quelques méta-données du modÚle mais peut être personnalisé. Lisez _`Noms |
|---|
| 60 |
de table` un peu plus bas. |
|---|
| 61 |
* Un champ ``id`` est ajouté automatiquement, mais ce comportement peut être |
|---|
| 62 |
modifié. Lisez `Les champs de clé primaire automatiques`_ plus bas. |
|---|
| 63 |
* Le code SQL ``CREATE TABLE`` de cet exemple est formaté en utilisant la |
|---|
| 64 |
syntaxe de PostgreSQL, mais il est bon de noter que Django adapte son code |
|---|
| 65 |
SQL au backend de la base de données spécifiée dans votre `fichier de |
|---|
| 66 |
configuration`_. |
|---|
| 67 |
|
|---|
| 68 |
.. _fichier de configuration: |
|---|
| 69 |
../settings/ |
|---|
| 70 |
|
|---|
| 71 |
Les champs |
|---|
| 72 |
========== |
|---|
| 73 |
|
|---|
| 74 |
La partie la plus importante d'un modÚle -- et la seule partie requise d'un |
|---|
| 75 |
modÚle -- est la liste des champs de base de données qu'il définit. Les champs |
|---|
| 76 |
sont définis par attributs de classe. |
|---|
| 77 |
|
|---|
| 78 |
Par exemple:: |
|---|
| 79 |
|
|---|
| 80 |
class Musicien(models.Model): |
|---|
| 81 |
prenom = models.CharField(maxlength=50) |
|---|
| 82 |
nom = models.CharField(maxlength=50) |
|---|
| 83 |
instrument = models.CharField(maxlength=100) |
|---|
| 84 |
|
|---|
| 85 |
class Album(models.Model): |
|---|
| 86 |
artiste = models.ForeignKey(Musicien) |
|---|
| 87 |
nom = models.CharField(maxlength=100) |
|---|
| 88 |
date_de_sortie = models.DateField() |
|---|
| 89 |
nb_etoiles = models.IntegerField() |
|---|
| 90 |
|
|---|
| 91 |
Restrictions des noms de champ |
|---|
| 92 |
------------------------------ |
|---|
| 93 |
|
|---|
| 94 |
Django place seulement deux restrictions sur les noms de champs d'un modÚle: |
|---|
| 95 |
|
|---|
| 96 |
1. Un nom de champ ne peut pas être un mot réservé du langage Python, parce |
|---|
| 97 |
que cela produirait une erreur de syntaxe Python. Par exemple:: |
|---|
| 98 |
|
|---|
| 99 |
class Exemple(models.Model): |
|---|
| 100 |
pass = models.IntegerField() # 'pass' est un mot réservé ! |
|---|
| 101 |
|
|---|
| 102 |
2. Un nom de champ ne peut pas contenir plusieurs underscores consécutifs, à |
|---|
| 103 |
cause de la maniÚre dont fonctionne la syntaxe de requête de recherche |
|---|
| 104 |
dans Django. Par exemple:: |
|---|
| 105 |
|
|---|
| 106 |
class Exemple(models.Model): |
|---|
| 107 |
foo__bar = models.IntegerField() 'foo__bar' a deux underscores ! |
|---|
| 108 |
|
|---|
| 109 |
Ces limitations peuvent être contournées car votre nom de champ de doit pas |
|---|
| 110 |
nécessairement correspondre au nom de colonne de votre base de données. Lisez |
|---|
| 111 |
`db_column`_ plus bas. |
|---|
| 112 |
|
|---|
| 113 |
Les mots réservés du SQL, tels que ``join``, ``where`` ou ``select``, *sont* |
|---|
| 114 |
permis comme noms de champ du modÚle, parce que Django échappe tous les noms de |
|---|
| 115 |
table et colonne de base de données dans toutes les requêtes en SQL. Il utilise |
|---|
| 116 |
la syntaxe entre guillemets adaptée à votre moteur de base de données. |
|---|
| 117 |
|
|---|
| 118 |
Les types de champ |
|---|
| 119 |
------------------ |
|---|
| 120 |
|
|---|
| 121 |
Chaque champ de votre modÚle devrait être une instance de la classe ``Field`` |
|---|
| 122 |
appropriée. Django utilise les types de classe de champs pour déterminer |
|---|
| 123 |
quelques points: |
|---|
| 124 |
|
|---|
| 125 |
* Le type de la colonne de base de données (par exemple, ``INTEGER``, |
|---|
| 126 |
``VARCHAR``). |
|---|
| 127 |
* Le widget à utiliser dans l'interface d'administration de Django, si vous |
|---|
| 128 |
envisagez de l'utiliser (par exemple, ``<input type="text">``, ``<select>``). |
|---|
| 129 |
* La validation minimale des données saisies dans le site d'admin de Django |
|---|
| 130 |
et dans les manipulateurs. |
|---|
| 131 |
|
|---|
| 132 |
Voici tout les types de champs disponibles: |
|---|
| 133 |
|
|---|
| 134 |
``AutoField`` |
|---|
| 135 |
~~~~~~~~~~~~~ |
|---|
| 136 |
|
|---|
| 137 |
C'est un ``IntegerField`` qui s'incrémente automatiquement selon les IDs |
|---|
| 138 |
disponibles. Vous aurez rarement à l'utiliser directement ; un champ de clé |
|---|
| 139 |
primaire sera automatiquement ajouté à votre modÚle si vous ne spécifiez pas une |
|---|
| 140 |
instruction contraire. Lisez les `Les champs de clé primaire automatiques`_. |
|---|
| 141 |
|
|---|
| 142 |
``BooleanField`` |
|---|
| 143 |
~~~~~~~~~~~~~~~~ |
|---|
| 144 |
|
|---|
| 145 |
Un champs vrai/faux. |
|---|
| 146 |
|
|---|
| 147 |
L'interface d'admin le représente par une boîte de choix (checkbox). |
|---|
| 148 |
|
|---|
| 149 |
``CharField`` |
|---|
| 150 |
~~~~~~~~~~~~~ |
|---|
| 151 |
|
|---|
| 152 |
Un champ de chaîne de caractÚres, pour les chaînes courtes comme longues. |
|---|
| 153 |
|
|---|
| 154 |
Pour les trÚs longues chaînes de texte, préférez plutÎt ``TextField``. |
|---|
| 155 |
|
|---|
| 156 |
L'interface d'admin le représente par un ``<input type="text">`` (une entrée à |
|---|
| 157 |
simple ligne). |
|---|
| 158 |
|
|---|
| 159 |
``CharField`` possÚde un argument supplémentaire requis, ``maxlength``, la |
|---|
| 160 |
longueur maximale (en caractÚres) du champ. Le maxlength est imposé au niveau base de données et |
|---|
| 161 |
est utilisé par Django pour la validation. |
|---|
| 162 |
|
|---|
| 163 |
``CommaSeparatedIntegerField`` |
|---|
| 164 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|---|
| 165 |
|
|---|
| 166 |
Un champ de nombres entiers séparés par des virgules. Comme dans ``CharField``, |
|---|
| 167 |
l'argument ``maxlength`` est requis. |
|---|
| 168 |
|
|---|
| 169 |
``DateField`` |
|---|
| 170 |
~~~~~~~~~~~~~ |
|---|
| 171 |
|
|---|
| 172 |
Un champ de date. PossÚde quelques arguments supplémentaires facultatifs: |
|---|
| 173 |
|
|---|
| 174 |
====================== =================================================== |
|---|
| 175 |
Argument Description |
|---|
| 176 |
====================== =================================================== |
|---|
| 177 |
``auto_now`` Définit automatiquement le champ à la date courante |
|---|
| 178 |
à chaque fois que l'objet est enregistré. Utile |
|---|
| 179 |
pour les champs « derniÚre-modif ». Notez que la date |
|---|
| 180 |
actuelle est *toujours* utilisée ; ce n'est pas |
|---|
| 181 |
seulement une valeur par défaut que vous pourriez |
|---|
| 182 |
modifier. |
|---|
| 183 |
|
|---|
| 184 |
``auto_now_add`` Définit automatiquement le champ à la date courante |
|---|
| 185 |
quand l'objet est créé la premiÚre fois. Utile pour |
|---|
| 186 |
contenir les dates de création. Notez que la date |
|---|
| 187 |
actuelle est *toujours* utilisée ; ce n'est pas |
|---|
| 188 |
seulement une valeur par défaut que vous pourriez |
|---|
| 189 |
modifier. |
|---|
| 190 |
====================== =================================================== |
|---|
| 191 |
|
|---|
| 192 |
L'interface d'admin le représente par un ``<input type="text">`` avec un |
|---|
| 193 |
calendrier JavaScript et un raccourci pour « Aujourd'hui ». |
|---|
| 194 |
|
|---|
| 195 |
``DateTimeField`` |
|---|
| 196 |
~~~~~~~~~~~~~~~~~ |
|---|
| 197 |
|
|---|
| 198 |
Un champ de date et heure. Prend les mêmes options supplémentaires que |
|---|
| 199 |
``DateField``. |
|---|
| 200 |
|
|---|
| 201 |
L'interface d'admin le représente par deux champs ``<input type="text">``, avec |
|---|
| 202 |
des raccourcis JavaScript. |
|---|
| 203 |
|
|---|
| 204 |
``EmailField`` |
|---|
| 205 |
~~~~~~~~~~~~~~ |
|---|
| 206 |
|
|---|
| 207 |
Un ``CharField`` qui vérifie que la valeur est une adresse de courrier |
|---|
| 208 |
électronique valide. |
|---|
| 209 |
``maxlength`` n'est pas accepté. |
|---|
| 210 |
|
|---|
| 211 |
``FileField`` |
|---|
| 212 |
~~~~~~~~~~~~~ |
|---|
| 213 |
|
|---|
| 214 |
Un champ d'envoi de fichier. |
|---|
| 215 |
|
|---|
| 216 |
PossÚde un argument supplémentaire obligatoire, ``upload_to``, définissant un |
|---|
| 217 |
chemin local du systÚme de fichiers où les fichiers reçus devraient être |
|---|
| 218 |
conservés. Ce chemin peut contenir du `formatage strftime (en)`_, qui sera |
|---|
| 219 |
remplacé par la date et/ou l'heure où le fichier est reçu (ainsi ces fichiers |
|---|
| 220 |
reçus ne remplissent pas un répertoire donné). |
|---|
| 221 |
|
|---|
| 222 |
L'interface d'admin le représente par un ``<input type="file">`` (un widget |
|---|
| 223 |
d'envoi de fichier). |
|---|
| 224 |
|
|---|
| 225 |
Utiliser un ``FileField`` ou un ``ImageField`` (voir ci-dessous) dans un modÚle |
|---|
| 226 |
requiert quelques étapes: |
|---|
| 227 |
|
|---|
| 228 |
1. Dans votre fichier de configuration, vous aurez besoin de définir |
|---|
| 229 |
``MEDIA_ROOT`` avec le chemin absolu vers un répertoire où vous aimeriez |
|---|
| 230 |
que Django stocke les fichiers reçus. (Pour des raisons de performance, |
|---|
| 231 |
ces fichiers ne sont pas stockés dans la base de données.) Définissez |
|---|
| 232 |
``MEDIA_URL`` avec l'URL de base publique représentant ce répertoire. |
|---|
| 233 |
Assurez-vous que ce répertoire a les droits en écriture pour le compte |
|---|
| 234 |
utilisateur de celui qui lance le serveur Web. |
|---|
| 235 |
|
|---|
| 236 |
2. Ajoutez le ``FileField`` ou le ``ImageField`` dans votre modÚle, |
|---|
| 237 |
assurez-vous de définir l'option ``upload_to`` pour dire à Django dans quel |
|---|
| 238 |
sous-répertoire de ``MEDIA_ROOT`` il devrait conserver les fichiers reçus. |
|---|
| 239 |
|
|---|
| 240 |
3. Tout ce qui sera stocké dans la base de données sera un chemin vers le |
|---|
| 241 |
fichier (relativement à ``MEDIA_ROOT``). Vous aurez certainement à |
|---|
| 242 |
utiliser la fonction utilitaire ``get_<fieldname>_url`` fournie par |
|---|
| 243 |
Django. Par exemple, si votre ``ImageField`` s'appelle ``mug_shot``, |
|---|
| 244 |
vous pouvez obtenir l'URL absolue de votre image dans un template avec |
|---|
| 245 |
``{{ object.get_mug_shot_url }}``. |
|---|
| 246 |
|
|---|
| 247 |
.. _`formatage strftime (en)`: http://docs.python.org/lib/module-time.html#l2h-1941 |
|---|
| 248 |
|
|---|
| 249 |
``FilePathField`` |
|---|
| 250 |
~~~~~~~~~~~~~~~~~ |
|---|
| 251 |
|
|---|
| 252 |
Un champ dont les choix sont limités aux noms de fichier d'un certain répertoire |
|---|
| 253 |
du systÚme de fichiers. PossÚde trois arguments spéciaux, dont le premier est |
|---|
| 254 |
requis: |
|---|
| 255 |
|
|---|
| 256 |
====================== =================================================== |
|---|
| 257 |
Argument Description |
|---|
| 258 |
====================== =================================================== |
|---|
| 259 |
``path`` Obligatoire. Le chemin absolu du systÚme de |
|---|
| 260 |
fichiers d'un répertoire dans lequel ce |
|---|
| 261 |
``FilePathField`` est censé générer ses choix. |
|---|
| 262 |
Par exemple: ``"/home/images"``. |
|---|
| 263 |
|
|---|
| 264 |
``match`` Facultatif. Une expression rationnelle, sous forme |
|---|
| 265 |
de chaîne de caractÚres, que ``FilePathField`` |
|---|
| 266 |
utilisera pour filtrer les noms de fichier. Notez |
|---|
| 267 |
que cette regex sera appliquée au nom de base du |
|---|
| 268 |
fichier, et non au chemin complet. Par exemple: |
|---|
| 269 |
``"foo.*\.txt^"``, qui va garder un fichier nommé |
|---|
| 270 |
``foo23.txt`` mais pas ``bar.txt`` ni |
|---|
| 271 |
``foo23.gif``. |
|---|
| 272 |
|
|---|
| 273 |
``recursive`` Facultatif. Soit ``True``, soit ``False``. |
|---|
| 274 |
``False`` par défaut. Spécifie si tous les |
|---|
| 275 |
sous-répertoires de ``path`` devraient être inclus. |
|---|
| 276 |
====================== =================================================== |
|---|
| 277 |
|
|---|
| 278 |
Bien-sûr, ces trois arguments peuvent être utilisés ensemble. |
|---|
| 279 |
|
|---|
| 280 |
Une grande source d'erreur potentielle vient du fait que ``match`` s'applique |
|---|
| 281 |
sur le nom de base du fichier, et non sur le chemin complet. Donc, cet |
|---|
| 282 |
exemple:: |
|---|
| 283 |
|
|---|
| 284 |
FilePathField(path="/home/images", match="foo.*", recursive=True) |
|---|
| 285 |
|
|---|
| 286 |
...va garder ``/home/images/foo.gif`` mais pas ``/home/images/foo/bar.gif`` |
|---|
| 287 |
parce que le ``match`` s'appliquera sur le nom de base du fichier (``foo.gif`` et |
|---|
| 288 |
``bar.gif``). |
|---|
| 289 |
|
|---|
| 290 |
``FloatField`` |
|---|
| 291 |
~~~~~~~~~~~~~~ |
|---|
| 292 |
|
|---|
| 293 |
Un nombre à virgule flottante. PossÚde deux arguments **obligatoires**: |
|---|
| 294 |
|
|---|
| 295 |
====================== =================================================== |
|---|
| 296 |
Argument Description |
|---|
| 297 |
====================== =================================================== |
|---|
| 298 |
``max_digits`` Le nombre maximal de chiffres permis dans le |
|---|
| 299 |
nombre. |
|---|
| 300 |
|
|---|
| 301 |
``decimal_places`` Le nombre de décimales aprÚs la virgule pour |
|---|
| 302 |
stocker le nombre. |
|---|
| 303 |
====================== =================================================== |
|---|
| 304 |
|
|---|
| 305 |
Par exemple, pour stocker des nombres jusqu'à 999 avec une résolution de 2 |
|---|
| 306 |
chiffres aprÚs la virgule, vous utiliseriez:: |
|---|
| 307 |
|
|---|
| 308 |
models.FloatField(..., max_digits=5, decimal_places=2) |
|---|
| 309 |
|
|---|
| 310 |
Et poour stocker des nombres jusqu'Ã approximativement un milliard avec une |
|---|
| 311 |
résolution de 10 chiffres aprÚs la virgule:: |
|---|
| 312 |
|
|---|
| 313 |
models.FloatField(..., max_digits=19, decimal_places=10) |
|---|
| 314 |
|
|---|
| 315 |
L'interface d'admin le représente par un ``<input type="text">`` (une entrée à |
|---|
| 316 |
une seule ligne). |
|---|
| 317 |
|
|---|
| 318 |
``ImageField`` |
|---|
| 319 |
~~~~~~~~~~~~~~ |
|---|
| 320 |
|
|---|
| 321 |
Comme ``FileField``, mais contrÎle que l'objet reçu est une image valide. |
|---|
| 322 |
PossÚde deux arguments supplémentaires facultatifs, ``height_field`` et |
|---|
| 323 |
``width_field``, qui, si définis, auto-redimensionneront à la largeur et hauteur |
|---|
| 324 |
donnée l'image à chaque fois que l'intance de modÚle est sauvegardée. |
|---|
| 325 |
|
|---|
| 326 |
Requiert la `BibliothÚque d'Imagerie Python - PIL (en)`_. |
|---|
| 327 |
|
|---|
| 328 |
.. _BibliothÚque d'Imagerie Python - PIL (en): http://www.pythonware.com/products/pil/ |
|---|
| 329 |
|
|---|
| 330 |
``IntegerField`` |
|---|
| 331 |
~~~~~~~~~~~~~~~~ |
|---|
| 332 |
|
|---|
| 333 |
Un entier. |
|---|
| 334 |
|
|---|
| 335 |
L'interface d'admin le représente par un ``<input type="text">`` (une entrée à |
|---|
| 336 |
une seule ligne). |
|---|
| 337 |
|
|---|
| 338 |
``IPAddressField`` |
|---|
| 339 |
~~~~~~~~~~~~~~~~~~ |
|---|
| 340 |
|
|---|
| 341 |
Une adresse IP, dans son format de chaîne de caractÚres (c'est-à -dire |
|---|
| 342 |
"24.124.1.30"). |
|---|
| 343 |
|
|---|
| 344 |
L'interface d'admin le représente par un ``<input type="text">`` (une entrée à |
|---|
| 345 |
une seule ligne). |
|---|
| 346 |
|
|---|
| 347 |
``NullBooleanField`` |
|---|
| 348 |
~~~~~~~~~~~~~~~~~~~~ |
|---|
| 349 |
|
|---|
| 350 |
Comme un ``BooleanField``, sauf qu'il admet ``NULL`` comme un des choix. |
|---|
| 351 |
Utilisez cela à la place d'un ``BooleanField`` avec ``null=True``. |
|---|
| 352 |
|
|---|
| 353 |
L'interface d'admin le représente par une boîte ``<select>`` avec les choix |
|---|
| 354 |
"Inconnu", "Oui" et "Non". |
|---|
| 355 |
|
|---|
| 356 |
``PasswordField`` |
|---|
| 357 |
~~~~~~~~~~~~~~~~~ |
|---|
| 358 |
|
|---|
| 359 |
Un ``PasswordField`` est comme un ``TextField`` à part que les caractÚres entrés |
|---|
| 360 |
sont masqués, typiquement par une astérisque (*), lorsqu'ils sont saisis dans un |
|---|
| 361 |
formulaire. Notez que même si la donnée est masquée en entrée, elle est envoyée |
|---|
| 362 |
en texte clair au serveur et stocké en plein texte dans la base de données. Des |
|---|
| 363 |
mesures supplémentaires (telles que l'usage de HTTPS) sont nécessaires pour |
|---|
| 364 |
assurer la sécurité des données envoyées depuis un formulaire. Ce champ est |
|---|
| 365 |
probablement plus utile lorsqu'il est employé dans un `manipulateur personnalisé`_ |
|---|
| 366 |
et non directement dans un modÚle. |
|---|
| 367 |
|
|---|
| 368 |
.. _manipulateur personnalisé: ../forms/#custom-forms-and-manipulators |
|---|
| 369 |
|
|---|
| 370 |
``PhoneNumberField`` |
|---|
| 371 |
~~~~~~~~~~~~~~~~~~~~ |
|---|
| 372 |
|
|---|
| 373 |
Un ``CharField`` qui vérifie que la valeur est un numéro de téléphone américain |
|---|
| 374 |
valide (au format ``XXX-XXX-XXXX``). |
|---|
| 375 |
|
|---|
| 376 |
``PositiveIntegerField`` |
|---|
| 377 |
~~~~~~~~~~~~~~~~~~~~~~~~ |
|---|
| 378 |
|
|---|
| 379 |
Comme un ``IntegerField``, sauf qu'il doit être positif. |
|---|
| 380 |
|
|---|
| 381 |
``PositiveSmallIntegerField`` |
|---|
| 382 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|---|
| 383 |
|
|---|
| 384 |
Comme un ``PositiveIntegerField``, Ã part qu'il admet seulement les valeurs |
|---|
| 385 |
inférieures à une certaine limite (qui dépend de la base de données). |
|---|
| 386 |
|
|---|
| 387 |
``SlugField`` |
|---|
| 388 |
~~~~~~~~~~~~~ |
|---|
| 389 |
|
|---|
| 390 |
« Slug » est un terme anglophone employé dans le jargon de la publication. Un |
|---|
| 391 |
slug est un court libellé pour désigner quelque chose, contenant seulement des |
|---|
| 392 |
lettres, des nombres, des underscores ou des traits d'union. Ils sont |
|---|
| 393 |
généralement utilisés dans les URLs. |
|---|
| 394 |
|
|---|
| 395 |
Dans la version en développement de Django, vous pouvez spécifier ``maxlength``. |
|---|
| 396 |
Si ``maxlength`` n'est pas spécifié, Django utilisera une longueur par défaut de |
|---|
| 397 |
50. Dans les versions précédentes de Django, il n'est pas possible de modifier la |
|---|
| 398 |
longueur de 50. |
|---|
| 399 |
|
|---|
| 400 |
Implique que ``db_index=True``. |
|---|
| 401 |
|
|---|
| 402 |
Accepte une option supplémentaire, ``prepopulate_from``, qui est une liste de |
|---|
| 403 |
champs depuis laquelle on peut auto-générer le slug, via JavaScript, dans le |
|---|
| 404 |
formulaire de description d'un objet de l'interface d'admin:: |
|---|
| 405 |
|
|---|
| 406 |
models.SlugField(prepopulate_from=("prenom", "nom")) |
|---|
| 407 |
|
|---|
| 408 |
``prepopulate_from`` n'accepte pas les DateTimeFields. |
|---|
| 409 |
|
|---|
| 410 |
L'interface d'admin représente un ``SlugField`` par un ``<input type="text">`` |
|---|
| 411 |
(une entrée à une seule ligne). |
|---|
| 412 |
|
|---|
| 413 |
``SmallIntegerField`` |
|---|
| 414 |
~~~~~~~~~~~~~~~~~~~~~ |
|---|
| 415 |
|
|---|
| 416 |
Comme un ``IntegerField``, à part qu'il admet seulement les valeurs inférieures |
|---|
| 417 |
à une certaine limite (qui dépend de la base de données). |
|---|
| 418 |
|
|---|
| 419 |
``TextField`` |
|---|
| 420 |
~~~~~~~~~~~~~ |
|---|
| 421 |
|
|---|
| 422 |
Un champ de texte long. |
|---|
| 423 |
|
|---|
| 424 |
L'interface d'admin le représente par un ``<textarea>`` (une entrée à lignes |
|---|
| 425 |
multiples). |
|---|
| 426 |
|
|---|
| 427 |
``TimeField`` |
|---|
| 428 |
~~~~~~~~~~~~~ |
|---|
| 429 |
|
|---|
| 430 |
Une heure. Accepte les mêmes options d'auto-définition que ``DateField`` et |
|---|
| 431 |
``DateTimeField``. |
|---|
| 432 |
|
|---|
| 433 |
L'interface d'admin le représente par un ``<input type="text">`` avec quelques |
|---|
| 434 |
raccourcis JavaScript. |
|---|
| 435 |
|
|---|
| 436 |
``URLField`` |
|---|
| 437 |
~~~~~~~~~~~~ |
|---|
| 438 |
|
|---|
| 439 |
Un champ pour une URL. Si l'option ``verify_exists`` est à ``True`` (par défaut), |
|---|
| 440 |
l'existence de l'URL donnée sera vérifiée (c'est-à -dire que l'URL charge et ne |
|---|
| 441 |
renvoie pas une réponse 404). |
|---|
| 442 |
|
|---|
| 443 |
L'interface d'admin le représente par un ``<input type="text">`` (une entrée à |
|---|
| 444 |
une seule ligne). |
|---|
| 445 |
|
|---|
| 446 |
``USStateField`` |
|---|
| 447 |
~~~~~~~~~~~~~~~~ |
|---|
| 448 |
|
|---|
| 449 |
Une abbréviation de deux lettres désignant un état américain. |
|---|
| 450 |
|
|---|
| 451 |
L'interface d'admin le représente par un ``<input type="text">`` (une entrée |
|---|
| 452 |
d'une seule ligne). |
|---|
| 453 |
|
|---|
| 454 |
``XMLField`` |
|---|
| 455 |
~~~~~~~~~~~~ |
|---|
| 456 |
|
|---|
| 457 |
Un ``TextField`` qui vérifie que la valeur est du XML valide qui correspond au |
|---|
| 458 |
schéma donné. Prend un argument obligatoire, ``schema_path``, qui est un chemin |
|---|
| 459 |
du systÚme de fichier vers un schéma RelaxNG_ à partir duquel le champ sera |
|---|
| 460 |
contrÎlé. |
|---|
| 461 |
|
|---|
| 462 |
.. _RelaxNG: http://www.relaxng.org/ |
|---|
| 463 |
|
|---|
| 464 |
Les options de champ |
|---|
| 465 |
-------------------- |
|---|
| 466 |
|
|---|
| 467 |
Les arguments suivants sont disponibles pour tous les types de champ. Ils sont |
|---|
| 468 |
tous facultatifs. |
|---|
| 469 |
|
|---|
| 470 |
``null`` |
|---|
| 471 |
~~~~~~~~ |
|---|
| 472 |
|
|---|
| 473 |
S'il est mis à ``True``, Django stockera les valeurs vides comme des ``NULL`` |
|---|
| 474 |
dans la base de données. |
|---|
| 475 |
Par défaut, ``False``. |
|---|
| 476 |
|
|---|
| 477 |
Notez que les valeurs de chaîne vide seront toujours stockées sous forme de |
|---|
| 478 |
chaînes vides, et non en tant que ``NULL`` -- donc utilisez ``null=True`` pour |
|---|
| 479 |
les champs qui ne sont pas des chaînes de caractÚres, tels que les entiers, les |
|---|
| 480 |
booléens et les dates. |
|---|
| 481 |
|
|---|
| 482 |
Inutile d'utiliser ``null`` sur les champs basés sur des chaînes de caractÚres, |
|---|
| 483 |
tels que ``CharField`` et ``TextField``, sauf si vous avez une excellente |
|---|
| 484 |
raison. Si un champ basé sur des chaînes de caractÚres possÚde l'option |
|---|
| 485 |
``null=True``, cela signifie qu'il y a deux valeurs possibles pour "pas de |
|---|
| 486 |
données": |
|---|
| 487 |
``NULL``, et la chaîne vide. Dans la plupart des cas, il est redondant d'avoir |
|---|
| 488 |
deux valeurs possibles pour "pas de donnée"; la convention adoptée par Django |
|---|
| 489 |
est d'utiliser la chaîne vide plutÎt que ``NULL``. |
|---|
| 490 |
|
|---|
| 491 |
``blank`` |
|---|
| 492 |
~~~~~~~~~ |
|---|
| 493 |
|
|---|
| 494 |
S'il est mis à ``True``, on permet que le champ soit vide. |
|---|
| 495 |
|
|---|
| 496 |
Notez que celui-ci est différent de ``null``. ``null`` est purement lié à la |
|---|
| 497 |
base de données, alors que ``blank`` est lié au contrÎle de la validité de la |
|---|
| 498 |
saisie. Si un champ a l'option ``blank=True``, le systÚme de validation dans le |
|---|
| 499 |
site d'admin de Django autorisera la saisie de valeur vide. Si un champ a l'option |
|---|
| 500 |
``blank=False``, le champ sera obligatoire. |
|---|
| 501 |
|
|---|
| 502 |
``choices`` |
|---|
| 503 |
~~~~~~~~~~~ |
|---|
| 504 |
|
|---|
| 505 |
Une séquence itérable (par exemple, une liste ou un tuple) constitué de 2-tuples |
|---|
| 506 |
qui seront utilisé comme liste à choix multiples pour ce champ. |
|---|
| 507 |
|
|---|
| 508 |
Si cette option est donnée, l'interface d'admin de Django utilisera une boîte |
|---|
| 509 |
de sélection au lieu du champ de texte standard et limitera les choix aux choix |
|---|
| 510 |
donnés. |
|---|
| 511 |
|
|---|
| 512 |
Une liste à choix multiples ressemble à ceci:: |
|---|
| 513 |
|
|---|
| 514 |
GRADES_ECOLE_SPORTIVE = ( |
|---|
| 515 |
('PS', 'Poussin'), |
|---|
| 516 |
('MN', 'Minime'), |
|---|
| 517 |
('JR', 'Junior'), |
|---|
| 518 |
('SR', 'Sénior'), |
|---|
| 519 |
('VT', 'Vétéran'), |
|---|
| 520 |
) |
|---|
| 521 |
|
|---|
| 522 |
Le premier élément de chaque tuple est la valeur qui sera en fait stockée. Le |
|---|
| 523 |
second élément est la définition qui sera affichée à l'utilisateur pour ce |
|---|
| 524 |
choix-là . |
|---|
| 525 |
|
|---|
| 526 |
Les listes à choix multiples peuvent être aussi bien définies à l'intérieur de |
|---|
| 527 |
votre classe de modÚle:: |
|---|
| 528 |
|
|---|
| 529 |
class Toto(models.Model): |
|---|
| 530 |
LISTE_GENRES = ( |
|---|
| 531 |
('H', 'Homme'), |
|---|
| 532 |
('F', 'Femmme'), |
|---|
| 533 |
) |
|---|
| 534 |
genre = models.CharField(maxlength=1, choices=LISTE_GENRES) |
|---|
| 535 |
|
|---|
| 536 |
Qu'à l'extérieur de votre classe de modÚle:: |
|---|
| 537 |
|
|---|
| 538 |
LISTE_GENRES = ( |
|---|
| 539 |
('H', 'Homme'), |
|---|
| 540 |
('F', 'Femme'), |
|---|
| 541 |
) |
|---|
| 542 |
class Toto(models.Model): |
|---|
| 543 |
genre = models.CharField(maxlength=1, choices=LISTE_GENRES) |
|---|
| 544 |
|
|---|
| 545 |
Enfin, notez que ces choix peuvent être n'importe quel objet itérable -- pas |
|---|
| 546 |
nécessairement une liste ou un tuple. Cela vous permet de construire des listes |
|---|
| 547 |
à choix multiples dynamiquement. Mais si vous vous retrouvez à coder les objets |
|---|
| 548 |
que vous passez dans ``choices`` pour être dynamique, il serait probablement |
|---|
| 549 |
mieux que vous utilisiez une table de base de données à part avec une clé |
|---|
| 550 |
étrangÚre ``ForeignKey``. ``choices`` est censé être utilisé pour de la donnée |
|---|
| 551 |
statique qui ne change plus. |
|---|
| 552 |
|
|---|
| 553 |
``core`` |
|---|
| 554 |
~~~~~~~~ |
|---|
| 555 |
|
|---|
| 556 |
Pour des objets qui sont édités à l'intérieur d'un objet lié. |
|---|
| 557 |
|
|---|
| 558 |
Dans l'interface d'admin de Django, si tous les champs « core » dans un objet |
|---|
| 559 |
édité imbriqué sont vides, alors cet objet est supprimé. |
|---|
| 560 |
|
|---|
| 561 |
Une erreur est déclenchée si on a une relation d'édition imbriquée sans au moins |
|---|
| 562 |
un champ ``core=True``. |
|---|
| 563 |
|
|---|
| 564 |
Merci de noter que chaque champ marqué "core" est traité comme un champ requis |
|---|
| 565 |
par le site d'admin de Django. En particulier, cela signifie que vous devriez |
|---|
| 566 |
mettre ``core=True`` sur tout les champs obligatoire dans votre objet lié qui |
|---|
| 567 |
est édité à l'intérieur d'un autre. |
|---|
| 568 |
|
|---|
| 569 |
``db_column`` |
|---|
| 570 |
~~~~~~~~~~~~~ |
|---|
| 571 |
|
|---|
| 572 |
Le nom de la colonne de base de données à utiliser pour ce champ. S'il n'est pas |
|---|
| 573 |
fourni, Django utilisera le nom du champ. |
|---|
| 574 |
|
|---|
| 575 |
Si votre nom de colonne est un mot réservé du langage SQL, ou s'il contient des |
|---|
| 576 |
caractÚres qui ne sont pas permis dans les noms de variable Python -- notamment, |
|---|
| 577 |
le trait d'union -- c'est bon. Django met entre guillemets les noms de tables et |
|---|
| 578 |
de colonnes de maniÚre transparente. |
|---|
| 579 |
|
|---|
| 580 |
``db_index`` |
|---|
| 581 |
~~~~~~~~~~~~ |
|---|
| 582 |
|
|---|
| 583 |
S'il est mis à ``True``, ``django-admin.py sqlindexes`` affichera une |
|---|
| 584 |
instruction ``CREATE INDEX`` |
|---|
| 585 |
pour ce champ. |
|---|
| 586 |
|
|---|
| 587 |
``default`` |
|---|
| 588 |
~~~~~~~~~~~ |
|---|
| 589 |
|
|---|
| 590 |
La valeur par défaut du champ. |
|---|
| 591 |
|
|---|
| 592 |
``editable`` |
|---|
| 593 |
~~~~~~~~~~~~ |
|---|
| 594 |
|
|---|
| 595 |
S'il est mis à ``False``, le champ ne sera pas éditable dans l'interface |
|---|
| 596 |
d'admin. Par défaut, ``True``. |
|---|
| 597 |
|
|---|
| 598 |
``help_text`` |
|---|
| 599 |
~~~~~~~~~~~~~ |
|---|
| 600 |
|
|---|
| 601 |
Un texte d'aide supplémentaire à afficher sous le champ dans le formulaire |
|---|
| 602 |
d'édition d'un objet de l'interface d'admin. C'est utile pour la documentation, |
|---|
| 603 |
même si votre objet n'a pas de formulaire d'administration. |
|---|
| 604 |
|
|---|
| 605 |
``primary_key`` |
|---|
| 606 |
~~~~~~~~~~~~~~~ |
|---|
| 607 |
|
|---|
| 608 |
S'il est mis à ``True``, ce champ est la clé primaire du modÚle. |
|---|
| 609 |
|
|---|
| 610 |
Si vous ne spécifiez ``primary_key=True`` pour aucun champ de votre modÚle, |
|---|
| 611 |
Django ajoutera automatiquement ce champ:: |
|---|
| 612 |
|
|---|
| 613 |
id = models.AutoField('ID', primary_key=True) |
|---|
| 614 |
|
|---|
| 615 |
Ainsi, vous n'avez pas besoin de définir ``primary_key=True`` sur l'un de vos |
|---|
| 616 |
champs, sauf si voulez changer ce comportement par défaut de clé primaire. |
|---|
| 617 |
|
|---|
| 618 |
``primary_key=True`` implique ``blank=False``, ``null=False`` et |
|---|
| 619 |
``unique=True``. Seule une clé primaire est permise par objet. |
|---|
| 620 |
|
|---|
| 621 |
``radio_admin`` |
|---|
| 622 |
~~~~~~~~~~~~~~~ |
|---|
| 623 |
|
|---|
| 624 |
Par défaut, l'interface d'admin de Django utilise la boîte de sélection |
|---|
| 625 |
(<select>) pour les champs de clé étrangÚre ``ForeignKey`` ou qui ont l'option |
|---|
| 626 |
``choices`` définie. Si ``radio_admin`` est mis à ``True``, Django utilisera |
|---|
| 627 |
des boutons radios à la place. |
|---|
| 628 |
|
|---|
| 629 |
à ne pas utiliser pour les champs autres que ``ForeignKey`` ou ayant l'option |
|---|
| 630 |
``choices`` définie. |
|---|
| 631 |
|
|---|
| 632 |
``unique`` |
|---|
| 633 |
~~~~~~~~~~ |
|---|
| 634 |
|
|---|
| 635 |
S'il est mis à ``True``, le champ devra être unique sur toute la table. |
|---|
| 636 |
|
|---|
| 637 |
Ce contrÎle est effectué au niveau base de données, ainsi qu'au niveau des |
|---|
| 638 |
formulaires d'administration de Django. |
|---|
| 639 |
|
|---|
| 640 |
``unique_for_date`` |
|---|
| 641 |
~~~~~~~~~~~~~~~~~~~ |
|---|
| 642 |
|
|---|
| 643 |
Donnez-lui comme valeur le nom d'un ``DateField`` ou d'un ``DateTimeField`` pour |
|---|
| 644 |
demander que ce champ soit unique en fonction de la valeur du champ de date. |
|---|
| 645 |
|
|---|
| 646 |
Par exemple, si vous avez un champ ``titre`` qui possÚde |
|---|
| 647 |
``unique_for_date="pub_date"``, alors Django n'autorisera pas la saisie de deux |
|---|
| 648 |
enregistrements avec le même ``titre`` et ``pub_date``. |
|---|
| 649 |
|
|---|
| 650 |
Ce contrÎle est effectué au niveau des formulaires d'administration de Django, mais |
|---|
| 651 |
pas au niveau de la base de données. |
|---|
| 652 |
|
|---|
| 653 |
``unique_for_month`` |
|---|
| 654 |
~~~~~~~~~~~~~~~~~~~~ |
|---|
| 655 |
|
|---|
| 656 |
Comme ``unique_for_date``, mais la contrainte d'unicité du champ se fait en |
|---|
| 657 |
fonction du mois. |
|---|
| 658 |
|
|---|
| 659 |
``unique_for_year`` |
|---|
| 660 |
~~~~~~~~~~~~~~~~~~~ |
|---|
| 661 |
|
|---|
| 662 |
Comme ``unique_for_date`` et ``unique_for_month``. |
|---|
| 663 |
|
|---|
| 664 |
``validator_list`` |
|---|
| 665 |
~~~~~~~~~~~~~~~~~~ |
|---|
| 666 |
|
|---|
| 667 |
Une liste de validateurs supplémentaires à appliquer sur le champ. Chacuns |
|---|
| 668 |
doivent être appelables (callable) en prenant les paramÚtres ``field_data, all_data`` |
|---|
| 669 |
et déclenchant ``django.core.validators.ValidationError`` en cas d'erreurs. |
|---|
| 670 |
(Lisez la `documentation des validateurs`_.) |
|---|
| 671 |
|
|---|
| 672 |
Django fournit quelques validateurs. Ils se trouvent dans |
|---|
| 673 |
``django.core.validators``. |
|---|
| 674 |
|
|---|
| 675 |
.. _documentation des validateurs: ../forms/#validators |
|---|
| 676 |
|
|---|
| 677 |
Noms de champs explicites |
|---|
| 678 |
------------------------- |
|---|
| 679 |
|
|---|
| 680 |
Chaque type de champ, excepté ``ForeignKey``, ``ManyToManyField`` et |
|---|
| 681 |
``OneToOneField``, prend un argument facultatif en premiÚre position -- un |
|---|
| 682 |
nom explicite. Si le nom explicite n'est pas donné, Django le créera |
|---|
| 683 |
automatiquement en utilisant le nom de l'attribut du champ, en convertissant les |
|---|
| 684 |
underscores en espaces. |
|---|
| 685 |
|
|---|
| 686 |
Dans cet exemple, le nom explicite est ``"Prénom de la personne"``:: |
|---|
| 687 |
|
|---|
| 688 |
prenom = models.CharField("Prénom de la personne", maxlength=30) |
|---|
| 689 |
|
|---|
| 690 |
Dans cet exemple, le nom explicite est ``"prenom"``:: |
|---|
| 691 |
|
|---|
| 692 |
prenom = models.CharField(maxlength=30) |
|---|
| 693 |
|
|---|
| 694 |
``ForeignKey``, ``ManyToManyField`` et ``OneToOneField`` requiÚrent que le |
|---|
| 695 |
premier argument soit une classe de modÚle, donc il faut utiliser l'argument |
|---|
| 696 |
mot-clé ``verbose_name``:: |
|---|
| 697 |
|
|---|
| 698 |
sondage = models.ForeignKey(Sondage, verbose_name="le sondage associé") |
|---|
| 699 |
sites = models.ManyToManyField(Site, verbose_name="liste de sites") |
|---|
| 700 |
lieu = models.OneToOneField(Lieu, verbose_name="lieu associé") |
|---|
| 701 |
|
|---|
| 702 |
Nous convenons de ne pas mettre de majuscule à la premiÚre lettre du |
|---|
| 703 |
``verbose_name``. Django mettra automatiquement la majuscule à la premiÚre |
|---|
| 704 |
lettre lorsque ça sera nécessaire. |
|---|
| 705 |
|
|---|
| 706 |
Les relations |
|---|
| 707 |
------------- |
|---|
| 708 |
|
|---|
| 709 |
C'est clair, la puissance des bases de données relationnelles repose sur les |
|---|
| 710 |
relations entre les tables. Django offre la possibilité de définir les trois |
|---|
| 711 |
types de relations les plus courantes entre des tables de données: many-to-one |
|---|
| 712 |
(1..n), many-to-many (n..n) and one-to-one (1..1). |
|---|
| 713 |
|
|---|
| 714 |
Les relations many-to-one |
|---|
| 715 |
~~~~~~~~~~~~~~~~~~~~~~~~~ |
|---|
| 716 |
|
|---|
| 717 |
Pour définir une relation « many-to-one », utilisez ``ForeignKey``. Vous |
|---|
| 718 |
l'utilisez simplement comme n'importe quel autre type ``Field``: en l'incluant |
|---|
| 719 |
comme un attribut de classe du modÚle. |
|---|
| 720 |
|
|---|
| 721 |
``ForeignKey`` requiert un argument en premiÚre position: La classe à laquelle |
|---|
| 722 |
le modÚle est reliée. |
|---|
| 723 |
|
|---|
| 724 |
Par exemple, si un modÚle ``Voiture`` a un ``Constructeur`` -- à savoir qu'un |
|---|
| 725 |
``Constructeur`` fabrique plusieurs voitures mais chaque ``Voiture`` n'a qu'un |
|---|
| 726 |
seul ``Constructeur`` -- utilisez les définitions suivantes:: |
|---|
| 727 |
|
|---|
| 728 |
class Constructeur(models.Model): |
|---|
| 729 |
# ... |
|---|
| 730 |
|
|---|
| 731 |
class Voiture(models.Model): |
|---|
| 732 |
constructeur = models.ForeignKey(Constructeur) |
|---|
| 733 |
# ... |
|---|
| 734 |
|
|---|
| 735 |
Pour créer une relation récursive -- un objet qui a une relation "many-to-one" |
|---|
| 736 |
avec lui-même -- utilisez ``models.ForeignKey('self')``. |
|---|
| 737 |
|
|---|
| 738 |
Si vous avez besoin de créer une relation sur un modÚle qui n'a pas encore été |
|---|
| 739 |
défini, vous pouvez utiliser le nom du modÚle, plutÎt que l'objet du modÚle |
|---|
| 740 |
lui-même:: |
|---|
| 741 |
|
|---|
| 742 |
class Voiture(models.Model): |
|---|
| 743 |
constructeur = models.ForeignKey('Constructeur') |
|---|
| 744 |
# ... |
|---|
| 745 |
|
|---|
| 746 |
class Constructeur(models.Model): |
|---|
| 747 |
# ... |
|---|
| 748 |
|
|---|
| 749 |
Notez, cependant, que cette fonctionnalité d'utiliser des chaînes de caractÚres |
|---|
| 750 |
pour définir des noms de modÚle dans ``ForeignKey`` est assez récente, et peut |
|---|
| 751 |
buguer un peu dans certains cas. |
|---|
| 752 |
|
|---|
| 753 |
DerriÚre tout ça, Django concatÚne ``"_id"`` au nom du champ pour créer son nom |
|---|
| 754 |
de colonne de base de données. Dans l'exemple ci-dessus, la table de base de |
|---|
| 755 |
données pour le modÚle ``Voiture`` aura une colonne ``constructeur_id``. (Vous |
|---|
| 756 |
pouvez le changer explicitement en spécifiant ``db_column``; voir ``db_column`` |
|---|
| 757 |
plus bas.) Cependant, votre code ne devrait jamais avoir à traiter avec le nom |
|---|
| 758 |
de colonne de la base de données, sauf si vous écrivez du code SQL perso. Vous |
|---|
| 759 |
traiterez toujours avec les noms de champ de votre objet de modÚle. |
|---|
| 760 |
|
|---|
| 761 |
Il est suggéré, mais non indispensable, que le nom d'un champ ``ForeignKey`` |
|---|
| 762 |
(``constructeur`` dans l'exemple ci-dessus) soit le nom du modÚle, en |
|---|
| 763 |
minuscules. Vous pouvez, bien-sûr, appeler le champ de la maniÚre que vous |
|---|
| 764 |
voulez. Par exemple:: |
|---|
| 765 |
|
|---|
| 766 |
class Voiture(models.Model): |
|---|
| 767 |
societe_qui_la_fabrique = models.ForeignKey(Constructeur) |
|---|
| 768 |
# ... |
|---|
| 769 |
|
|---|
| 770 |
Consultez `l'exemple de modÚle utilisant une relation Many-to-one`_ pour un |
|---|
| 771 |
exemple complet. |
|---|
| 772 |
|
|---|
| 773 |
.. _l'exemple de modÚle utilisant une relation Many-to-one: |
|---|
| 774 |
../models/many_to_one/ |
|---|
| 775 |
|
|---|
| 776 |
Les champs ``ForeignKey`` prennent un certain nombre d'arguments supplémentaires |
|---|
| 777 |
pour définir comment devraient fonctionner les relations. Tous sont facultatifs: |
|---|
| 778 |
|
|---|
| 779 |
======================= =========================================================== |
|---|
| 780 |
Argument Description |
|---|
| 781 |
======================= =========================================================== |
|---|
| 782 |
``edit_inline`` S'il n'est pas mis à ``False``, l'objet est |
|---|
| 783 |
édité "en ligne" à l'intérieur de la page de |
|---|
| 784 |
l'objet associé, de maniÚre imbriquée. Cela |
|---|
| 785 |
signifie que l'objet n'aura pas sa propre |
|---|
| 786 |
interface d'admin. Utilisez soit |
|---|
| 787 |
``models.TABULAR``, soit ``models.STACKED``, qui, |
|---|
| 788 |
respectivement, désignent que les objets inbriqués |
|---|
| 789 |
sont affiché comme un tableau ou comme une "pile" |
|---|
| 790 |
de définitions de champs. |
|---|
| 791 |
|
|---|
| 792 |
``limit_choices_to`` Un dictionnaire d'arguments de recherche et de |
|---|
| 793 |
valeurs (voir le `document de référence de l'API |
|---|
| 794 |
de base de données`_) qui limite les choix |
|---|
| 795 |
disponible dans l'interface d'admin pour cet |
|---|
| 796 |
objet. Utilisez-le avec ``models.LazyDate`` pour |
|---|
| 797 |
limiter les choix des objets selon la date. Par |
|---|
| 798 |
exemple:: |
|---|
| 799 |
|
|---|
| 800 |
limit_choices_to = {'pub_date__lte': models.LazyDate()} |
|---|
| 801 |
|
|---|
| 802 |
autorise seulement le choix des objets liés avec |
|---|
| 803 |
un ``pub_date`` antérieure à la date et heure |
|---|
| 804 |
actuelle pour être choisi. |
|---|
| 805 |
|
|---|
| 806 |
à la place d'un dictionnaire, ça peut aussi être |
|---|
| 807 |
un objet ``Q`` (un objet avec une méthode |
|---|
| 808 |
``get_sql()``) pour des requêtes plus complexe. |
|---|
| 809 |
|
|---|
| 810 |
Non compatible avec ``edit_inline``. |
|---|
| 811 |
|
|---|
| 812 |
``max_num_in_admin`` Pour les objets édités "en ligne", il s'agit du |
|---|
| 813 |
nombre maximum d'objets liés à afficher dans |
|---|
| 814 |
l'interface d'admin. |
|---|
| 815 |
Ainsi, si une pizza ne peut avoir que 10 |
|---|
| 816 |
ingrédients, ``max_num_in_admin=10`` s'assurera |
|---|
| 817 |
qu'un utilisateur n'entre jamais plus de 10 |
|---|
| 818 |
ingrédients à la fois. |
|---|
| 819 |
|
|---|
| 820 |
Notez que ça ne vérifiera pas si 10 ingrédients ont déjà |
|---|
| 821 |
été crées. Cette option ne contrÎle que |
|---|
| 822 |
l'interface d'admin; il ne s'occupe pas du niveau |
|---|
| 823 |
API Python ni du niveau base de données. |
|---|
| 824 |
|
|---|
| 825 |
``min_num_in_admin`` Le nombre minimum d'objets liés affichés dans |
|---|
| 826 |
l'interface d'admin. Normalement, au stade de la |
|---|
| 827 |
création, les objets "en ligne" sont montrés au |
|---|
| 828 |
nombre de ``num_in_admin``, et au stade de |
|---|
| 829 |
l'édition, des objects vide sont montrés au |
|---|
| 830 |
nombre de ``num_extra_on_change`` en plus de tous |
|---|
| 831 |
les objets liés pré-existants. Cependant, il n'y |
|---|
| 832 |
aura jamais d'objets liés affichés à un nombre |
|---|
| 833 |
inférieur à ``min_num_in_admin``. |
|---|
| 834 |
|
|---|
| 835 |
``num_extra_on_change`` Le nombre de champs vides d'objets liés |
|---|
| 836 |
supplémentaires, montrés au stade de modification. |
|---|
| 837 |
|
|---|
| 838 |
``num_in_admin`` Le nombre par défaut d'objets "en ligne" à |
|---|
| 839 |
afficher sur la page de l'objet au stade de |
|---|
| 840 |
l'ajout. |
|---|
| 841 |
|
|---|
| 842 |
``raw_id_admin`` Affiche seulement un champ pour saisir un nombre |
|---|
| 843 |
entier à la place d'un menu déroulant. C'est utile |
|---|
| 844 |
lorsqu'il est lié à un type d'objet qui aura trop |
|---|
| 845 |
d'enregistrements pour faire une boîte de |
|---|
| 846 |
sélection pratique. |
|---|
| 847 |
|
|---|
| 848 |
Non utilisé avec ``edit_inline``. |
|---|
| 849 |
|
|---|
| 850 |
``related_name`` Le nom à utiliser pour la relation depuis l'objet |
|---|
| 851 |
lié vers l'objet courant. Regardez la |
|---|
| 852 |
`documentation sur les objets liés`_ pour une |
|---|
| 853 |
explication complÚte et des exemples. |
|---|
| 854 |
|
|---|
| 855 |
``to_field`` Le champs de l'objet lié sur lequel porte la |
|---|
| 856 |
relation. Par défaut, Django utilise la clé |
|---|
| 857 |
primaire de l'objet lié. |
|---|
| 858 |
======================= =========================================================== |
|---|
| 859 |
|
|---|
| 860 |
.. _`document de référence de l'API de base de données`: ../db_api/ |
|---|
| 861 |
.. _`documentation sur les objets liés`: ../db_api/#related-objects |
|---|
| 862 |
|
|---|
| 863 |
Les relations many-to-many |
|---|
| 864 |
~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|---|
| 865 |
|
|---|
| 866 |
Pour définir une relation many-to-many, utilisez la classe ``ManyToManyField``. |
|---|
| 867 |
Vous n'avez qu'Ã l'utiliser comme n'importe quelle autre classe de type |
|---|
| 868 |
``Field``: en l'incluant comme un attribut de classe dans votre modÚle. |
|---|
| 869 |
|
|---|
| 870 |
``ManyToManyField`` requiert un argument obligatoire: la classe vers laquelle le |
|---|
| 871 |
modÚle est lié. |
|---|
| 872 |
|
|---|
| 873 |
Par exemple, si une ``Pizza`` a de multiples objets ``Ingredient`` -- |
|---|
| 874 |
c'est-à -dire qu'un ``Ingredient`` peut être sur plusieurs pizzas et que chaque |
|---|
| 875 |
``Pizza`` a plusieurs ingrédients -- voici comment vous représenteriez cela:: |
|---|
| 876 |
|
|---|
| 877 |
class Ingredient(models.Model): |
|---|
| 878 |
# ... |
|---|
| 879 |
|
|---|
| 880 |
class Pizza(models.Model): |
|---|
| 881 |
# ... |
|---|
| 882 |
ingredients = models.ManyToManyField(Ingredient) |
|---|
| 883 |
|
|---|
| 884 |
Comme avec la classe ``ForeignKey``, une relation sur soi-même peut être définie |
|---|
| 885 |
en utilisant la chaîne de caractÚres ``'self'`` à la place du nom du modÚle, et |
|---|
| 886 |
vous pouvez référencer des modÚles non encore définis en utilisant une chaîne de |
|---|
| 887 |
caractÚres contenant le nom du modÚle. |
|---|
| 888 |
|
|---|
| 889 |
Il est suggéré, mais non requis, que le nom d'un champ ``ManyToManyField`` |
|---|
| 890 |
(``ingredients`` dans l'exemple ci-dessus) soit un pluriel décrivant l'ensemble |
|---|
| 891 |
des objets du modÚle lié. |
|---|
| 892 |
|
|---|
| 893 |
DerriÚre tout ça, Django crée une table de jointure intermédiaire pour |
|---|
| 894 |
représenter la relation many-to-many. |
|---|
| 895 |
|
|---|
| 896 |
La définition de ``ManyToManyField`` dans l'un ou l'autre modÚle n'a pas |
|---|
| 897 |
d'importance, mais vous devez le faire dans un seul des modÚles -- pas dans les |
|---|
| 898 |
deux. |
|---|
| 899 |
|
|---|
| 900 |
Généralement, les instances de ``ManyToManyField`` devraient être définies dans |
|---|
| 901 |
l'objet qui sera édité dans l'interface d'admin, si vous utilisez celle de |
|---|
| 902 |
Django. Dans l'exemple précédent, ``ingredients`` est dans ``Pizza`` (plutÎt |
|---|
| 903 |
qu'avoir un champ ``ManyToManyField`` ``pizzas`` dans ``Ingredient``) parce qu'il |
|---|
| 904 |
est plus naturel de penser à une pizza ayant des ingrédients que à un ingrédient |
|---|
| 905 |
présent dans plusieurs pizzas. Avec la maniÚre dont c'est défini dans l'exemple, |
|---|
| 906 |
le formulaire d'administration de ``Pizza`` proposerait aux utilisateurs de |
|---|
| 907 |
sélectionner les ingrédients. |
|---|
| 908 |
|
|---|
| 909 |
Regardez `L'exemple de relation many-to-many entre modÚles`_ pour un exemple |
|---|
| 910 |
complet. |
|---|
| 911 |
|
|---|
| 912 |
.. _L'exemple de relation many-to-many entre modÚles: ../models/many_to_many/ |
|---|
| 913 |
|
|---|
| 914 |
Les objets ``ManyToManyField`` prennent un certain nombre d'arguments |
|---|
| 915 |
supplémentaires pour définir la façon dont la relation devrait fonctionner. |
|---|
| 916 |
Tous sont facultatifs: |
|---|
| 917 |
|
|---|
| 918 |
======================= ================================================== |
|---|
| 919 |
Argument Description |
|---|
| 920 |
======================= ================================================== |
|---|
| 921 |
``related_name`` Lisez la description dans la section |
|---|
| 922 |
``ForeignKey`` plus haut. |
|---|
| 923 |
|
|---|
| 924 |
``filter_interface`` Utilise une interface de filtrage Javascript |
|---|
| 925 |
discrÚte et astucieuse au lieu d'un |
|---|
| 926 |
``<select multiple>`` à l'utilité discutable, dans |
|---|
| 927 |
le formulaire d'administration de cet objet. |
|---|
| 928 |
La valeur devrait être ``models.HORIZONTAL`` ou |
|---|
| 929 |
``models.VERTICAL`` (c'est à dire que l'interface |
|---|
| 930 |
devrait être empilée horizontalement ou |
|---|
| 931 |
verticalement). |
|---|
| 932 |
|
|---|
| 933 |
``limit_choices_to`` Lisez la description dans la section |
|---|
| 934 |
``ForeignKey`` plus haut. |
|---|
| 935 |
|
|---|
| 936 |
``symmetrical`` Uniquement employé dans la définition de champs |
|---|
| 937 |
ManyToManyFields sur eux-mêmes. |
|---|
| 938 |
Considérez le modÚle suivant: |
|---|
| 939 |
|
|---|
| 940 |
class Personne(models.Model): |
|---|
| 941 |
amis = models.ManyToManyField("self") |
|---|
| 942 |
|
|---|
| 943 |
Lorsque Django traite ce modÚle, il reconnait |
|---|
| 944 |
avoir affaire à un ``ManyToManyField`` sur |
|---|
| 945 |
lui-même, et par conséquent, il n'ajoute pas |
|---|
| 946 |
d'attribut ``personne_set`` Ã la classe |
|---|
| 947 |
``Personne``. Ã la place, le ``ManyToManyField`` |
|---|
| 948 |
garantit d'être symétrique -- c'est-à -dire que si |
|---|
| 949 |
je suis ton ami, donc tu es mon ami. |
|---|
| 950 |
|
|---|
| 951 |
Si vous ne voulez pas de symétrie dans vos |
|---|
| 952 |
relations ``ManyToMany`` avec ``'self'``, |
|---|
| 953 |
définissez ``symmetrical`` à ``False``. Cela |
|---|
| 954 |
forcera Django à ajouter un descripteur pour la |
|---|
| 955 |
relation inverse, permettant aux relations |
|---|
| 956 |
``ManyToMany`` d'être asymétriques. |
|---|
| 957 |
|
|---|
| 958 |
======================= ================================================== |
|---|
| 959 |
|
|---|
| 960 |
Les relations one-to-one |
|---|
| 961 |
~~~~~~~~~~~~~~~~~~~~~~~~ |
|---|
| 962 |
|
|---|
| 963 |
La sémantique des relations one-to-one est en cours de changement, nous ne vous |
|---|
| 964 |
recommandons donc pas de les utiliser. Si cela ne vous fait pas partir en |
|---|
| 965 |
courant, jetez un Åil à ceci. |
|---|
| 966 |
|
|---|
| 967 |
Pour définir une relation one-to-one, utilisez la classe ``OneToOneField``. Vous |
|---|
| 968 |
n'avez qu'Ã l'employer comme n'importe quelle autre classe de type ``Field``: en |
|---|
| 969 |
l'incluant comme attribut de classe dans votre modÚle. |
|---|
| 970 |
|
|---|
| 971 |
Il est des plus utiles sur la clé primaire d'un objet quand celui-ci "étend" un |
|---|
| 972 |
autre objet d'une certaine façon. |
|---|
| 973 |
|
|---|
| 974 |
``OneToOneField`` requiert un argument obligatoire: La classe vers laquelle le |
|---|
| 975 |
modÚle est lié. |
|---|
| 976 |
|
|---|
| 977 |
Par exemple, si vous êtes en train de construire une base de données de "lieux", |
|---|
| 978 |
vous définirez des données basiques tels qu'une adresse, un numéro de téléphone, |
|---|
| 979 |
etc. dans la base de données. Puis, si vous voulez construire une base de |
|---|
| 980 |
données de restaurants étendant la définition d'un lieu, plutÎt que de vous |
|---|
| 981 |
répéter et de repliquer ces champs dans le modÚle ``Restaurant``, vous pourrez |
|---|
| 982 |
relier ``Restaurant`` à ``Lieu`` grâce à ``OneToOneField`` (parce qu'un |
|---|
| 983 |
restaurant "est-un" lieu). |
|---|
| 984 |
|
|---|
| 985 |
Comme avec ``ForeignKey``, une relation vers soi-même peut être définie en |
|---|
| 986 |
utilisant la chaîne de caractÚres ``"self"`` à la place du nom de modÚle ; les |
|---|
| 987 |
références vers des modÚles non encore définis peuvent être faites en utilisant |
|---|
| 988 |
une chaîne de caractÚres contenant le nom du modÚle. |
|---|
| 989 |
|
|---|
| 990 |
Ce ``OneToOneField`` remplacera en fait le champ de clé primaire ``id`` (puisque |
|---|
| 991 |
les relations one-to-one partagent la même clé primaire), et sera affiché comme |
|---|
| 992 |
un champ en lecture seule lorsque vous éditerez un objet dans l'interface |
|---|
| 993 |
d'admin: |
|---|
| 994 |
|
|---|
| 995 |
Regardez `l'exemple de relation one-to-one entre modÚles`_ pour un exemple |
|---|
| 996 |
complet. |
|---|
| 997 |
|
|---|
| 998 |
.. _l'exemple de relation one-to-one entre modÚles: ../models/one_to_one/ |
|---|
| 999 |
|
|---|
| 1000 |
Les options Meta |
|---|
| 1001 |
================ |
|---|
| 1002 |
|
|---|
| 1003 |
Définissez des métadonnées pour votre modÚle en utilisant une classe interne |
|---|
| 1004 |
``Meta``, comme ceci:: |
|---|
| 1005 |
|
|---|
| 1006 |
class Foo(models.Model): |
|---|
| 1007 |
bar = models.CharField(maxlength=30) |
|---|
| 1008 |
|
|---|
| 1009 |
class Meta: |
|---|
| 1010 |
# ... |
|---|
| 1011 |
|
|---|
| 1012 |
Les métadonnées de modÚle sont « tout ce qui n'est pas un champ », telles que |
|---|
| 1013 |
les options de tri, etc. |
|---|
| 1014 |
|
|---|
| 1015 |
Voici une liste de toutes les options ``Meta`` possibles. Aucune option n'est |
|---|
| 1016 |
obligatoire. Ajouter la définition ``class Meta`` dans un modÚle est tout à |
|---|
| 1017 |
fait optionnel. |
|---|
| 1018 |
|
|---|
| 1019 |
``db_table`` |
|---|
| 1020 |
------------ |
|---|
| 1021 |
|
|---|
| 1022 |
Le nom de la table de base de données à utiliser pour le modÚle:: |
|---|
| 1023 |
|
|---|
| 1024 |
db_table = 'album_de_musique' |
|---|
| 1025 |
|
|---|
| 1026 |
Si non défini, Django utilisera ``app_label + '_' + model_class_name``. |
|---|
| 1027 |
Voir « Les noms de table » plus bas pour plus de détails. |
|---|
| 1028 |
|
|---|
| 1029 |
Si le nom de votre table de base de données est un mot réservé SQL, ou contient |
|---|
| 1030 |
des caractÚres non permis dans les noms de variable Python -- notamment, le |
|---|
| 1031 |
tiret -- cette option est faite pour vous. Django s'occupe ensuite de placer les |
|---|
| 1032 |
noms de table et de colonne entre quotes automatiquement. |
|---|
| 1033 |
|
|---|
| 1034 |
``get_latest_by`` |
|---|
| 1035 |
----------------- |
|---|
| 1036 |
|
|---|
| 1037 |
Le nom d'un ``DateField`` ou ``DateTimeField`` dans le modÚle. Cela spécifie le |
|---|
| 1038 |
champ par défaut à utiliser dans la méthode ``latest()`` de votre modÚle |
|---|
| 1039 |
``Manager``. |
|---|
| 1040 |
|
|---|
| 1041 |
Exemple:: |
|---|
| 1042 |
|
|---|
| 1043 |
get_latest_by = "date_commande" |
|---|
| 1044 |
|
|---|
| 1045 |
Regardez les `docs sur latest()`_ pour plus de détails. |
|---|
| 1046 |
|
|---|
| 1047 |
.. _docs sur latest(): ../db_api/#latest-field-name-none |
|---|
| 1048 |
|
|---|
| 1049 |
``order_with_respect_to`` |
|---|
| 1050 |
------------------------- |
|---|
| 1051 |
|
|---|
| 1052 |
Marque cet objet comme « triable » respectivement au champ donné. Ceci est presque |
|---|
| 1053 |
toujours utilisé avec des objets liés pour permettre de les trier respectivement |
|---|
| 1054 |
à un objet parent. Par exemple, si une ``Reponse`` est liée à un objet |
|---|
| 1055 |
``Question``, et qu'une question possÚde plus d'une réponse, et que l'ordre des |
|---|
| 1056 |
réponses importe, vous ferez ceci:: |
|---|
| 1057 |
|
|---|
| 1058 |
class Reponse(models.Model): |
|---|
| 1059 |
question = models.ForeignKey(Question) |
|---|
| 1060 |
# ... |
|---|
| 1061 |
|
|---|
| 1062 |
class Meta: |
|---|
| 1063 |
order_with_respect_to = 'question' |
|---|
| 1064 |
|
|---|
| 1065 |
``ordering`` |
|---|
| 1066 |
------------ |
|---|
| 1067 |
|
|---|
| 1068 |
Le tri par défaut pour l'objet, utilisé pour obtenir des listes d'objets:: |
|---|
| 1069 |
|
|---|
| 1070 |
ordering = ['-date_commande'] |
|---|
| 1071 |
|
|---|
| 1072 |
Il s'agit d'un tuple ou d'une liste de chaînes de caractÚres. Chaque chaîne est |
|---|
| 1073 |
un nom de champ avec un préfixe facultatif "-", qui indique un ordre |
|---|
| 1074 |
décroissant. Les champs sans un "-" devant seront triés dans l'ordre croissant. |
|---|
| 1075 |
Utilisez la chaîne "?" pour mélanger aléatoirement. |
|---|
| 1076 |
|
|---|
| 1077 |
Par exemple, pour trier selon un champ ``date_publication`` de maniÚre |
|---|
| 1078 |
croissante, utilisez ceci:: |
|---|
| 1079 |
|
|---|
| 1080 |
ordering = ['date_publication'] |
|---|
| 1081 |
|
|---|
| 1082 |
Pour trier selon ``date_publication`` de maniÚre décroissante, utilisez ceci:: |
|---|
| 1083 |
|
|---|
| 1084 |
ordering = ['-date_publication'] |
|---|
| 1085 |
|
|---|
| 1086 |
Pour trier selon ``date_publication`` de maniÚre décroissante, puis selon |
|---|
| 1087 |
``auteur`` de maniÚre croissante, utilisez ceci:: |
|---|
| 1088 |
|
|---|
| 1089 |
ordering = ['-date_publication', 'auteur'] |
|---|
| 1090 |
|
|---|
| 1091 |
Regardez `Spécifier un ordre de tri`_ pour plus d'exemples. |
|---|
| 1092 |
|
|---|
| 1093 |
Notez que, sans regarder combien de champs sont dans ``ordering``, le site |
|---|
| 1094 |
d'administration utilise seulement le premier champ. |
|---|
| 1095 |
|
|---|
| 1096 |
.. _Spécifier un ordre de tri: ../models/ordering/ |
|---|
| 1097 |
|
|---|
| 1098 |
``permissions`` |
|---|
| 1099 |
--------------- |
|---|
| 1100 |
|
|---|
| 1101 |
Ce sont des permissions supplémentaires pour entrer dans la table de permission |
|---|
| 1102 |
lors de la création de cet objet. Les permissions d'ajout, suppression et |
|---|
| 1103 |
modification sont automatiquement créées pour chaque objet dont ``admin`` est |
|---|
| 1104 |
défini. Cet exemple spécifie une permission supplémentaire, |
|---|
| 1105 |
``peut_livrer_pizzas``:: |
|---|
| 1106 |
|
|---|
| 1107 |
permissions = (("peut_livrer_pizzas", "Peut livrer des pizzas"),) |
|---|
| 1108 |
|
|---|
| 1109 |
Il s'agit d'une liste ou d'un tuple formé de paire (tuples de 2 éléments) dans |
|---|
| 1110 |
le format ``(code_de_la_permission, nom_intuitif_de_la_permission)``. |
|---|
| 1111 |
|
|---|
| 1112 |
``unique_together`` |
|---|
| 1113 |
------------------- |
|---|
| 1114 |
|
|---|
| 1115 |
Définit les noms de champ qui, pris ensemble, doivent être uniques:: |
|---|
| 1116 |
|
|---|
| 1117 |
unique_together = (("livreur", "restaurant"),) |
|---|
| 1118 |
|
|---|
| 1119 |
Il s'agit d'une liste de listes des champs qui doivent être uniques lorsqu'ils |
|---|
| 1120 |
sont considérés ensemble. C'est utilisé dans l'administration de Django et est |
|---|
| 1121 |
renforcé au niveau de la base de données (c'est-à -dire que l'instruction |
|---|
| 1122 |
``UNIQUE`` appropriée est incluse dans la clause ``CREATE TABLE``). |
|---|
| 1123 |
|
|---|
<