【问题标题】:Copying data from parent model instance when child model instance is saved保存子模型实例时从父模型实例复制数据
【发布时间】:2020-01-24 08:36:12
【问题描述】:

我有一个包含唯一记录数据库的父模型,如下所示(截断 - 还有更多字段):

models.py - 父级

class DBPlatform(models.Model):

    description = models.CharField(max_length=300, unique=True)
    PDS_date = models.DateField()
    PDS_version = models.CharField(max_length=50, blank=True)

我使用这个模型来创建一个子模型,以节省我复制所有字段的时间。子模型保存特定的用户生成的父记录实例。它们被单独存储,因为它们可以由用户编辑:

models.py - 孩子

class Platform(DBPlatform):

    scenario = models.ForeignKey(Scenario,
                                 on_delete=models.CASCADE,
                                 related_name="platforms")
    database_platform = models.ForeignKey(DBPlatform,
                                          on_delete=models.CASCADE,
                                          related_name="instances")
    edited = models.BooleanField()

我正在使用 Django REST Framework 为最终应用创建 API。创建子模型时,我想将其所有继承字段更新为父模型的字段。到目前为止,我采取的令人难以置信的复杂步骤(不起作用)位于子模式的 views.py 文件中。如下:

api.views.py - 孩子

class PlatformViewSet(viewsets.ModelViewSet):
    lookup_field = "id"
    serializer_class = PlatformSerializer
    permission_classes = [IsAuthenticated]

    def perform_create(self, serializer):
        db_id = self.request.data["database_platform"]
        database_platform = get_object_or_404(DBPlatform, id=db_id)

        datadict = self.request.data.dict()
        datadict.update(database_platform.__dict__)

        query_dict = QueryDict('', mutable=True)
        query_dict.update(datadict)

        self.request.data = query_dict

        serializer.save()

我怎样才能实现我想要做的事情?我肯定采取了错误的方法,因为这并不罕见。

编辑: Ruddra 的评论让我认为整个设计模式是错误的。我应该只为“模板”实例使用一个模型和一个布尔标志吗?

【问题讨论】:

  • 我不明白,为什么需要将数据从父级复制到子级?为什么需要保留重复数据?
  • 父实例是模板,用户可以在子实例中编辑。

标签: python django django-rest-framework


【解决方案1】:

serializer 数据不会被serializer.save() 之前的操作更改。 如果您想这样做,您将编辑serializer 或重新序列化数据。

除非这需要仅通过 API 并且仅在此端点上发生,否则我建议覆盖模型的 save 方法或使用 pre_save 信号。为确保仅在创建新实例时执行此操作,您可以检查self(如果覆盖save)或instance(如果是信号)是否有id

【讨论】:

  • 所以这个解决方案在signals.py中工作得很好,但不幸的是,当创建一个新的子类时,它当然复制了父类,这是我不想要的。但问题的解决方案是什么。
猜你喜欢
  • 1970-01-01
  • 2013-05-21
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
相关资源
最近更新 更多