【问题标题】:How to nest abstract relationship in Django rest framework?如何在Django rest框架中嵌套抽象关系?
【发布时间】:2020-02-16 20:21:16
【问题描述】:

我有一个名为 Layer 的模型,它与 Geometry 具有一对一的关系,而 Geometry 具有以下设计:

class Geometry(models.Model):
    pass

class Circle(Geometry):
    radius = models.CharField(max_length=255)

class Rectangle(Geometry):
    height = models.CharField(max_length=255)
    width = models.CharField(max_length=255)

我应该如何定义层序列化器以使层 json 包含一个名为“几何”的属性,而不管它与哪个子模型有关系?我不希望该属性既不是圆形也不是矩形。

提前致谢!

【问题讨论】:

  • 您的序列化程序中需要哪个字段?如果您的需求包含子模型,则必须为每个模型定义不同的序列化程序。或者您可以使用 SerializerMethodField 自定义任何字段。如果我正确理解了您的需求,我想为您提供帮助。
  • 我希望我的层序列化程序包含一个名为 Geometry(父模型)的字段。例如: {"geometry": {radius: 100}} 或 {"geometry": {"height": 50, "width": 50}} 而不是 {"circle": {radius: 100}} 或 {"矩形”:{“高度”:50,“宽度”:50}}

标签: django django-models django-rest-framework


【解决方案1】:

您可以为每个子模型使用单独的序列化程序。您可以使用类型参数决定哪个序列化程序用于字典中的几何键。

data = {'geometry': CircleSerializer(circle_model_object).data if type == 'circle' else RectangleSerializer(rectangle_model_object).data}

【讨论】:

  • 问题是我不想创造条件来决定使用哪个序列化程序。因为我可以有 50 种不同的几何形状,不仅是圆形和矩形
  • 好吧,我明白你的问题了。其实我也有你这样的问题。我没有找到令人满意的解决方案。也许对你有一个想法,here。我使用了一个类型参数并创建了不同的序列化程序。我生成了一个字典,其类型为键,序列化程序类为值。我检测到序列化器这个方法。我希望这个对你有用。此外,您的几何模型是否有多个字段?也许您可以创建一个外键。这可能对你更有用。
猜你喜欢
  • 2014-09-18
  • 1970-01-01
  • 2016-05-30
  • 2017-06-28
  • 2014-05-21
  • 1970-01-01
  • 2020-11-07
  • 2019-06-14
  • 1970-01-01
相关资源
最近更新 更多