web-dev-qa-db-fra.com

Comment créer un champ entier à incrémentation automatique dans Django?

Je crée un modèle Order pour un panier et j’ai besoin de créer un champ qui s’incrémente automatiquement lorsque la commande est passée:

class Order(models.Model):
    cart = models.ForeignKey(Cart)
    add_date = models.DateTimeField(auto_now_add=True)
    order_number = models.IntegerField()
    enable = models.BooleanField(default=True)

Comment créer l'incrément automatique IntegerField?

39
Daniel Sibaja

Dans Django 1: Il y aura un champ par défaut avec le nom "id" qui est incrémenté automatiquement.
2: Vous pouvez définir n’importe quel champ en tant que champ à incrémentation automatique à l’aide du champ AutoField.

 class Order (models.Model): 
 auto_increment_id = models.AutoField (primary_key = True) 
 #vous utilisez primary_key = True si vous ne souhaitez pas utiliser le champ par défaut "id "donné par Django à votre modèle 

db design

 + ------------ + ------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------- + 
 | Tableau | Créer une table | 
 + ------------ + ---------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------------- + 
 | core_order | CREATE TABLE `core_order` (
` Auto_increment_id` int (11) NOT NULL AUTO_INCREMENT, 
 PRIMARY KEY (`auto_increment_id`) 
) ENGINE = InnoDB DEFAULT CHARSET = latin1 | 
 + ------------ + --------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------- + 
 1 ligne dans le set (0.01 sec) 

Si vous voulez utiliser l'id par défaut de Django comme champ d'incrémentation.

 class Order (models.Model): 
 dd_date = models.DateTimeField (auto_now_add = True) 

db design

 + ------------- + ------------------------------ -------------------------------------------------- -------------------------------------------------- ------------------------------- + 
 | Tableau | Créer une table | 
 + ------------- + --------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------------- + 
 | core_order | CREATE TABLE `core_order` (
` Id` int (11) NOT NULL AUTO_INCREMENT, 
 `Dd_date` date-heure NOT NULL, 
 PRIMARY KEY (` id`) 
) ENGINE = InnoDB DEFAULT CHARSET = latin1 | 
 + ------------- + -------------------- -------------------------------------------------- -------------------------------------------------- ----------------------------------------- + 
65
Prashant Gaur

Dans Django avec chaque modèle, vous obtiendrez le champ par défaut id qui est incrémentation automatique. Néanmoins, si vous souhaitez utiliser manuellement l’incrémentation automatique, il vous suffit de spécifier dans votre modèle AutoField.

class Author(models.Model):
    author_id = models.AutoField(primary_key=True)

vous pouvez en savoir plus sur le champ auto dans Django dans Documentation Django pour AutoField

18
Chitrank Dixit
class Belly(models.Model):
    belly_id = models.AutoField(primary_key=True)
    belly_name = models.CharField(max_length=50)

******** ou *******

class Belly(models.Model):
   belly_name = models.CharField(max_length=50)

La différence est:

La première table a la clé primaire belly_id (spécifié comme AutoField) et la deuxième table a la clé primaire id (implicitement).

Je pense qu'il n'est pas nécessaire de l'utiliser directement; un champ de clé primaire sera automatiquement ajouté à votre modèle si vous ne spécifiez pas . Sinon, consultez le Documentation Django pour AutoField pour plus de détails sur AutoField.

8
Mushahid Khan

Vous pouvez créer un champ automatique. Voici le documentation pour le même

S'il vous plaît rappelez-vous Django ne permettra pas d'avoir plus d'un champ AutoField dans un modèle. Dans votre modèle, vous en avez déjà un pour votre clé primaire (par défaut). Vous devrez donc remplacer La méthode save de model va probablement récupérer le dernier enregistrement inséré dans la table et incrémenter le compteur en conséquence et ajouter le nouvel enregistrement.

Veillez à sécuriser ce thread de code car dans le cas de demandes multiples, vous pourriez éventuellement essayer d'insérer la même valeur pour différents nouveaux enregistrements.

5
anuragal

Ce dont j'avais besoin: Un numéro de document avec un nombre fixe d'entiers qui agirait également comme un AutoField.

Mes recherches m'ont pris partout incl. cette page.

Enfin J'ai fait quelque chose comme ça:

J'ai créé une table avec un champ DocuNumber sous la forme d'un IntegerField avec foll. les attributs:

  • max_length=6
  • primary_key=True
  • unique=True
  • default=100000

Le max_length valeur rien si nécessaire (et donc le default= valeur).

Un warning est émis lors de la création dudit modèle, ce que je pouvais ignorer.

Par la suite, un document (factice) a été créé, auquel cas, comme prévu, le document avait une valeur de champ entier de 100 000.

Ensuite, modifiez le champ clé de modèle en tant que:

  • Changement du type de champ comme suit: AutoField
  • Je me suis débarrassé du max_length Et defaultattributs
  • A retenu le primary_key = True attribut

Le document suivant (document souhaité) créé avait la valeur 100001, les numéros suivants étant incrémentés de 1.

Jusqu'ici tout va bien.

1
user5076666

Vous pouvez utiliser la clé primaire par défaut (id) qui incrémente automatiquement.

Remarque: lorsque vous utilisez la première conception, c'est-à-dire que vous utilisez le champ par défaut (id) en tant que clé primaire, initialisez l'objet en mentionnant les noms des colonnes. par exemple.

class User(models.Model):
    user_name = models.CharField(max_length = 100)

puis initialiser,

user = User(user_name="XYZ")

si vous initialisez de la manière suivante,

user = User("XYZ")

then python essayera de définir id = "XYZ", ce qui vous donnera une erreur sur le type de données.

1
dhruven1600