我正在编写一些基于Django的自由软件。
我有一个Item类,它描述了一个定价计划(比如“订阅,每周10美元,没有试用期”)。
我的代码经常根据现有的内容创建新的项。例如,根据上述项目创建的新项目将是:“订阅,每周10美元,试用期为10天”(如果客户已经支付了10天)。
现在有两种项目:
现在的麻烦是:
./manage.py loaddata ...命令创建预定义的项,该命令从JSON文件加载项目。./manage.py loaddata ...,那么loaddata命令可能会覆盖其中一个修改的项(稍后由我的Python代码创建)。如何避免用新的预定义项覆盖修改过的项?更普遍的是,如何保持预定义项和修改项的区别,以确保代码能够区分哪些项是预定义的,哪些项不是?
发布于 2018-10-13 11:10:48
首先声明一个抽象模型:
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()允许创建预定义对象的副本,该副本将用于代替预定义对象本身。因此,我们不能担心预先定义的对象覆盖修改过的对象。
发布于 2018-10-08 19:57:20
Dumpdata和Loaddata不应用于创建“修改项”。也许这些命令更像是“备份”和“恢复”。如果要从json文件加载新创建的项,请编写自定义管理命令:
https://stackoverflow.com/questions/52709119
复制相似问题