django.db.utils.IntegrityError:删除记录时更新或删除表

时间:2017-05-01 00:49:38

标签: python mysql django postgresql

我使用django和postgress并且有一个非常奇怪的例外。 我有一个名为ProductModel的模型对象(upc为unique_id)。 这就是模型的样子:

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='')

不幸的是(正如我现在所理解的)在开始的时候我犯了一个错误并创建了一个名为product的类继承了ProductModel - 这个类有一些常用的方法没什么特别的。

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不知道它的存在 - 但是现在当我尝试使用这个命令删除一些产品记录时:

p = ProductModel.objects.all().filter(last_seen__month__lt=4,product_name__contains='a')
    p.delete()

我收到以下错误 -

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,发现这个表确实存在。 我想了解它是如何工作的以及我在这种情况下如何删除记录。 哦,还有一个细节 - 当我尝试通过django admin删除我的记录时,我设法做到没有任何问题。

感谢善意的帮助。

1 个答案:

答案 0 :(得分:0)

以下是您实际执行的操作:https://docs.djangoproject.com/en/1.11/topics/db/models/#multi-table-inheritance

对模型进行子类化(未定义为抽象)将创建一个名为Product的新表,该表具有到ProductModel pk的OneToOneField,即product_upc。您正在尝试删除具有Product表引用的ProductModel,这就是您收到错误的原因。

根据您使用该产品类的方式,我建议您只需将其超类更改为object并运行makemigrations即可删除该表,因为您实际上并不需要它。