class ItemBase(models.Model):
class Meta:
abstract = True
name = models.CharField(max_length=100)
# ...
然后声明:
class PredefinedItem(ItemBase):
pass
class ModifiedItem(ItemBase):
base = models.OneToOneField(PredefinedItem, null=True)
@atomic
@staticmethod
def obtain_predefined(id):
try:
return ModifiedItem.objects.get(base_id=id)
except ModifiedItem.DoesNotExist:
predefined = PredefinedItem.objects.get(pk=id)
return ModifiedItem.objects.create(base=id, **model_to_dict(
predefined,
fields=[f.name for f in ItemBase._meta.fields]))
obtain_predefined()
允许创建预定义对象的副本,使用此副本而不是预定义对象本身。因此,我们不必担心预定义对象会覆盖修改过的对象。
注:
https://stackoverflow.com/a/52787554/856090
使用的答案。