保存子模型实例时从父模型实例复制数据

2024-10-06 10:20:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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框架为最终的应用程序创建API。创建子模型时,我希望用父模型的字段更新其所有继承字段。到目前为止,我所采取的令人难以置信的复杂步骤(不起作用)都在子模式的views.py文件中。详情如下:

api.views.py-child

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的评论让我认为整个设计模式是错误的。我是否应该为“模板”实例使用单个模型和布尔标志


Tags: py模型selfidtruedatamodelsrequest
1条回答
网友
1楼 · 发布于 2024-10-06 10:20:36

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

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

相关问题 更多 >