我有一个父模型,其中包含一个唯一记录的数据库,如下所示(截断-还有更多字段):
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的评论让我认为整个设计模式是错误的。我是否应该为“模板”实例使用单个模型和布尔标志
serializer
之前的操作不会更改serializer.save()
数据。 如果您想这样做,您必须编辑serializer
或重新序列化数据除非这是只需要通过API并且只需要在这个端点上发生的事情,否则我建议覆盖模型的
save
方法或使用pre_save
信号。要确保仅在创建新实例时执行此操作,可以检查self
(在覆盖save
)或instance
(在信号情况下)是否有id
相关问题 更多 >
编程相关推荐