首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django loaddata命令的问题

Django loaddata命令的问题
EN

Stack Overflow用户
提问于 2018-10-08 19:46:48
回答 2查看 536关注 0票数 0

我正在编写一些基于Django的自由软件。

我有一个Item类,它描述了一个定价计划(比如“订阅,每周10美元,没有试用期”)。

我的代码经常根据现有的内容创建新的项。例如,根据上述项目创建的新项目将是:“订阅,每周10美元,试用期为10天”(如果客户已经支付了10天)。

现在有两种项目:

  • 预定义项目(如第一个示例所示);
  • 修改项目(基于另一项,如第二个示例所示)。

现在的麻烦是:

  • 我使用./manage.py loaddata ...命令创建预定义的项,该命令从JSON文件加载项目。
  • 我在Python代码中创建修改过的项。
  • 如果我向JSON代码添加一个新项并再次运行./manage.py loaddata ...,那么loaddata命令可能会覆盖其中一个修改的项(稍后由我的Python代码创建)。

如何避免用新的预定义项覆盖修改过的项?更普遍的是,如何保持预定义项和修改项的区别,以确保代码能够区分哪些项是预定义的,哪些项不是?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-13 11:10:48

首先声明一个抽象模型:

代码语言:javascript
复制
class ItemBase(models.Model):
    class Meta:
        abstract = True
    name = models.CharField(max_length=100)
    # ...

然后宣布:

代码语言:javascript
复制
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答案。

票数 0
EN

Stack Overflow用户

发布于 2018-10-08 19:57:20

Dumpdata和Loaddata不应用于创建“修改项”。也许这些命令更像是“备份”和“恢复”。如果要从json文件加载新创建的项,请编写自定义管理命令:

自定义管理命令

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52709119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档