2017-09-05 3 views
1

Actuellement, j'ai un projet Django avec une table ItemReport qui ne permet qu'une entrée par jour et par article. Tout va bien et tout, sauf que chaque fois qu'il échoue avec un IntegrityError (ie mon projet a essayé de créer un ItemReport un jour où un existe déjà ItemReport, les incréments d'identification de l'objet de toute façonComment arrêter Django/PSQL de l'ID de table à incrémentation automatique en cas d'échec de création

Par exemple:.

September 1: 
Report for September 1 (ID 1) 

September 2: 
Report for September 1 (ID 1) 
Report for September 2 (ID 5) 

modèles suivants:

class ItemReport(BaseModel): 
    fk_item: Item = models.ForeignKey(Item, null=False) 
    date = models.DateField(default=now, null=False) 

    class Meta: 
     unique_together=(('fk_item', 'date'),) 


class Item(BaseModel): 
    item_class = models.CharField(max_length=40, null=False) 
    name = models.CharField(max_length=80, unique=True, null=False) 

Bit de code qui est exécuté à chaque fois qu'un utilisateur se connecte à:

for i in Item.objects.all(): 
     try: 
      latest_ir = ItemReport.objects.create(fk_item=i) 
      print('Created Item Report!') 
     except IntegrityError as e: 
      print('ItemReport for {} for today already exists!'.format(i.name)) 
    print('Created ItemReports!\n') 
+3

Ne comptez pas sur les ID étant des valeurs particulières. Ils devraient être complètement indépendants de votre logique métier. –

+1

Donc, vous dites que l'utilisation d'ID dans la logique est une mauvaise pratique? J'allais les utiliser comme un moyen de s'assurer que les tables sont synchronisées correctement entre les serveurs. Si ce n'est pas par ID, alors, des idées sur une meilleure façon de le faire? – Dilisqq

Répondre

1

Vous ne pouvez pas le faire si pk est un champ d'incrémentation automatique. Lorsque vous essayez de créer un nouvel objet, la base de données obtient la séquence de formulaire de valeur. Et la séquence ne prend pas en charge l'annulation, car lorsque de nombreux utilisateurs insèrent de nouvelles lignes en même temps, et qu'une seule est annulée, pour la séquence de reconstruction, vous avez besoin de beaucoup d'opérations difficiles dans la base de données.

espérons que cela vous aidera.

+0

Je vois. Je ne savais pas que ça fonctionnait de cette façon. Donc, si j'ai bien compris, mettre le champ à l'incrément non-auto réglerait le problème? – Dilisqq

+0

Je pense que vous avez besoin d'un champ supplémentaire pour la logique qui ne sera pas l'incrémentation automatique –

+0

google "gapless sequence postgres" –