2017-09-05 3 views
1

現在、DjangoプロジェクトにはItemReportテーブルがあり、アイテムごとに1回のエントリしか許可されていません。すべてがすなわち私のプロジェクトはItemReportはすでにとにかく、オブジェクトID単位が存在する日にItemReportを作成しようとしました(それはIntegrityErrorで失敗したときにことを除いて罰金とすべてである作成失敗時にDjango/PSQLの自動インクリメントテーブルIDを停止する方法

たとえば:。

September 1: 
Report for September 1 (ID 1) 

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

モデルを次のように

:毎回実行するユーザーがログインしますコードの

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) 

ビット

+3

特定の値であるIDに依存しないでください。彼らはあなたのビジネスロジックとは完全に無関係でなければなりません。 –

+1

それでは、ロジックでIDを使うのは悪い習慣だと言っていますか?私は、テーブルがサーバー間で正しく同期されていることを確認する手段として、これらを使用するつもりでした。 IDでなければ、これを行うための良いアイデアは何ですか? – Dilisqq

答えて

1

pkが自動インクリメントフィールドの場合は実行できません。新しいオブジェクトを作成しようとすると、データベースは値のフォームシーケンスを取得します。多くのユーザーが同時に新しい行を挿入し、1つだけが中止されると、シーケンスの再構築のために、データベース内で多くのハード操作が必要になるため、シーケンスはロールバックをサポートしません。

お手数ですが、

+0

私は参照してください。私はそれがそのように働いたのか分からなかった。だから私が正しく理解していれば、フィールドを自動ではないインクリメントに設定すると問題が解決されますか? – Dilisqq

+0

私はあなたが自動インクリメントされないロジックのための余分なフィールドが必要だと思う –

+0

Google "gaplessシーケンスpostgres" –

関連する問題