2010-02-06 4 views
2

Je ne vois aucune disposition pour cela dans les documents django, alors comment les gens s'y prennent-ils.Comment les gens traitent-ils normalement les variables de classe dans django?

Mon cas spécifique est le suivant. J'ai un panier, chaque instance de panier a un champ de numéro de facture, mais le numéro de facture n'est généré que si le panier passe à un statut payant, donc toutes les instances de panier ne possèdent pas de numéro de facture. Je veux que tous les numéros de facture soient séquentiels sans aucun espace entre eux, donc le pk par défaut n'est pas parfait dans ce cas, donc je veux une variable de classe qui sert de compteur pour les numéros de facture, et est accessible par toutes les instances.

+0

Parlez-vous d'un champ DB ou que voulez-vous? Peut-être que vous pouvez fournir un code pour clarifier votre idée? –

+1

@ user267764: Parlez-vous des classes de modèles? Les classes Python ordinaires sont toujours des classes Python ordinaires. Les classes de modèles ne sont pas exactement la même chose car elles ont une métaclasse distincte. Cependant, ils ne sont encore que des cours. Pouvez-vous donner un exemple plus concret de code avec lequel vous rencontrez des problèmes? –

+0

Vous souhaitez donc avoir un numéro de facture séquentiel unique, partagé par divers objets? Quel est le but? –

Répondre

1

La clé primaire par défaut sera déjà un entier monotone unique (même dans SQLite si vous ne supprimez aucun enregistrement), vous pouvez donc simplement l'utiliser pour cela.

+0

Il a dit qu'il ne voulait pas d'écart: en cas d'échec de la transaction, s'il utilise le PK, il en aura probablement un. – piro

0

Vous pouvez créer un champ dans un modèle et l'indiquer comme clé primaire ou utiliser votre clé primaire actuelle si vous migrez une base de données existante primary_key=True. Django ORM ne prend pas en charge les clés complexes. Cela ne vous permet pas d'utiliser une table sans clé primaire. Si vous avez besoin d'une logique spécifique pour la génération de votre numéro de facture (par exemple # de client + '-' + numéro d'année), vous pouvez créer un champ pour cette clé, mais ce ne sera pas une clé primaire. Appelez cette fonction de génération de clé sur l'objet save dans la fonction Model.save si cette clé n'est pas encore spécifiée pour l'objet courant.

0

Demandez à votre champ de facture dans votre modèle:

class Cart(models.Model): 
..... 
invoice_id = models.PositiveIntegerField(null=True,unique=True) 

seulement définir la valeur, le cas échéant.

Pour trouver la prochaine ID:

try: 
    nextID = Cart.objects.exclude(invoice_id=None).order_by('-invoice_id')[0].invoice_id + 1 
except IndexError: 
    nextID = 1 

Après avoir pensé à ce sujet un peu plus ... il me semble que les factures pourraient être mieux servis comme un modèle distinct. Vous pouvez les lier à vos chariots avec ForeignKey("invoice",null=True). Ils peuvent ensuite être créés en cas de besoin, le champ de clé primaire par défaut peut être votre nombre monotone croissant, et peut alors avoir un cycle de vie séparé à vos objets panier.

+0

Ça a l'air bien. Je préférerais que si vous saisissiez le dernier ID de facture et que vous sauvegardiez le suivant, c'était une opération atomique. De cette façon, vous seriez absolument certain que les différentes commandes ne peuvent pas marcher sur les autres orteils. Probablement assez faisable avec la méthode supplémentaire dans l'ORM de Django. –

Questions connexes