我使用 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 = {}
现在,我确定这个类与数据库无关,数据库也不知道它的存在 - 但现在当我尝试使用此命令删除一些产品记录时:
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"
在这一点上,我完全迷路了,搞不清楚表“my_app_product”到底是什么——它为什么存在?? 我去了我的 PostgreSQL,发现这个表确实存在。 我想了解它是如何工作的以及在这种情况下我如何删除记录。 哦,还有一个细节 - 当我尝试通过 django admin 删除我的记录时,我成功地做到了这一点。
感谢好心的 helper 。
最佳答案
这是您实际执行的操作:https://docs.djangoproject.com/en/1.11/topics/db/models/#multi-table-inheritance
子类化模型(未定义为抽象模型)将创建一个名为 Product 的新表,该表具有一个 OneToOneField 到 ProductModel pk,即 product_upc
。您正在尝试删除引用了 Product 表的 ProductModel,这就是您收到错误的原因。
根据您使用 Product 类的方式,我建议将其父类(super class)更改为 object
并运行 makemigrations
以删除表,因为您实际上并不需要它.
关于python - django.db.utils.IntegrityError : update or delete on table when deleting a record 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43712890/