代码之家  ›  专栏  ›  技术社区  ›  porton

Django loaddata命令有问题

  •  0
  • porton  · 技术社区  · 7 年前

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

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

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

    • 我使用 ./manage.py loaddata ... 从JSON文件加载项的命令。
    • 如果我在JSON代码中添加一个新项并运行 ./manage.py加载数据。。。 再说一遍,然后(根据我的理解) loaddata 命令可能会覆盖其中一个修改过的项(稍后由Python代码创建)。

    2 回复  |  直到 7 年前
        1
  •  0
  •   contmp    7 年前

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

    Custom Management Commands

        2
  •  0
  •   porton    7 年前

    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 使用的答案。