2017-05-01 20 views
0

私はdjangoとpostgressを使用していますが、非常に奇妙な例外があります。 私はProductModelというモデルオブジェクトを持っています(upcをunique_idとして)。このクラスは、いくつかの定期的なメソッドは何もしています - (私は今理解したように)私はミスを犯したとProductModelを継承したクラスと呼ばれる製品を作成した時代の初めに、残念ながらdjango.db.utils.IntegrityError:レコードを削除するときにテーブルの更新または削除

class ProductModel(models.Model): 

def __str__(self): 
    return self.clean_name + " " + str(self.product_upc) 

product_name = models.CharField(max_length=300, blank=True) 
product_upc = models.CharField(max_length=300, primary_key=True) 
official_price = models.DecimalField(default=0, decimal_places=5, max_digits=10) 
mrsp = models.DecimalField(default=0, decimal_places=5, max_digits=10) 
last_seen = models.DateTimeField(default=now) 
clean_name = models.CharField(max_length=200, default='') 

:モデルがどのように見えるか ですファンシー。

p = ProductModel.objects.all().filter(last_seen__month__lt=4,product_name__contains='a') 
    p.delete() 
:私は、このコマンドを使用して、いくつかの製品のレコードを削除しようとすると、今はなく -

class Product(ProductModel): 
def __init__(self, *args, **kwargs): 
    super().__init__(*args, **kwargs) 
    self.create_clean_name() 
    self.img_list = [] 
    self.scraped_content = "" 
    self.specs = {} 

は今、私は、このクラスはその存在を意識DBとDB doesntのとは何の関係もないことを確認しました

私は次のエラーを取得する -

django.db.utils.IntegrityError: update or delete on table "my_app_productmodel" violates foreign key constraint "f64b7bfb6c6019a35bf6b81e4125240f" on table "my_app_product" 
     DETAIL: Key (product_upc)=(852896336240) is still referenced from table "my_app_product" 

そして、この時点で私は完全に失われたとh ***は、テーブル「my_app_product」は何か混乱してしまった - それが存在する理由? 私は自分のPostgreSQLに行き、このテーブルが実際に存在することを知りました。 どのように動作するのか、この状況でレコードを削除する方法を理解したいと思います。 ohhともう少し詳細 - 私はdjangoの管理者経由で私のレコードを削除しようとすると、私は何の問題もなくそれを行うことができます。

種類ヘルパーに感謝します。ここで

+0

Djangoは[here](https://docs.djangoproject.com/ja/1.10/topics/db/models/#multi-table-inheritance)に記載されているように、2つのモデル間に暗黙の 'OneToOneField'を作成しました。 。 PostgreSQLの 'Product'モデルとそれに対応するテーブルを削除しなければならないと思います。 – albar

答えて

0

は、あなたが実際にやったことです:https://docs.djangoproject.com/en/1.11/topics/db/models/#multi-table-inheritance

は、モデルのサブクラス(それはabstractとして定義されていない)product_upcあるOneToOneField ProductModelにPKを持つ新しいテーブルと呼ばれる製品を作成します。 Productテーブルへの参照を持つProductModelを削除しようとしています。そのため、エラーが発生します。

このProductクラスの使い方によっては、スーパークラスをobjectに変更し、makemigrationsを実行して実際には必要ないので、テーブルを削除することをお勧めします。

+0

あなたの助けをありがとうが、私は理解しませんでした。私はこの機能が必要です。製品クラスにメソッドなどがたくさんあるので、productModelを継承できるようにする必要があります。この厄介な問題を回避する方法はありますか? – misha312

+0

ProductをProductModelのサブクラスとして定義したため、「my_app_product」が存在します。 "my_app_product"から列をチェックすると、djangoによって自動的に作成された "_ptr"で終わるFKが表示されます。 "my_app_product"は必要ないので、Productクラスを変更してProductModelをサブクラス化せず、そのテーブルを削除するマイグレーションを作成するだけです。 –

+0

はい、それから私は製品を保存できません。今私は悪いデザインがあることを理解しています。応急処置としては、たくさんの製品を取り除いて製品クラスの機能を維持する方法を見つける必要があります。このクラスを使用してdbに商品を保存します(save()メソッドを継承します) – misha312

関連する問題