考虑这个文件:
from django.db import models
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Restaurant(Place):
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
现在,假设我有一个Restaurant
名为restaurant
。但是这个地方不再是餐厅,因此我想将其转变为一个地方。为此,我这样做:
p = Place.objects.get(pk=place_id)
p.restaurant.delete()
p.save()
它运作良好,p
不再是餐厅,但是发生了一些奇怪的事情:p
Place表中的主键(ID)发生了更改,例如是否删除了Place然后重新创建了Place。
为什么会这样呢?以及如何在不更改地点ID的情况下将餐厅转变为地点?
您restaurant
从DB2的两个表之间继承place
并对其Django
进行了一些处理。Django调用了该表Multi-table inheritance
。这种类型的设计的某些功能包括:
PK
的两个对象相同。- 从Django的角度来看,两个对象似乎是一个对象,因此一个对象的每次更改都会
PK
导致其他对象的自动更改。an automatically-created OneToOneField
两种模式之间存在联系。- 这些对象中有原子事务供查询。
因此,这是Django ORM的正常行为,而Django管理这两个对象的更改PK
。您可以通过concrete model
和multi-table inheritance
在此链接中阅读有关此概念的更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句