当前位置: 首页 > 面试题库 >

DRF:使用嵌套序列化程序进行简单的外键分配?

充普松
2023-03-14
问题内容

使用Django REST Framework,标准的ModelSerializer将允许通过将ID作为整数发布来分配或更改ForeignKey模型关系。

从嵌套序列化程序中获取此行为的最简单方法是什么?

注意,我只在谈论分配现有数据库对象,而不是嵌套创建。

过去,我在序列化程序中使用附加的“ id”字段以及自定义createupdate方法来解决这个问题,但是对我来说,这似乎是一个简单而频繁的问题,我很想知道最好的方法。

class Child(models.Model):
    name = CharField(max_length=20)

class Parent(models.Model):
    name = CharField(max_length=20)
    phone_number = models.ForeignKey(PhoneNumber)
    child = models.ForeignKey(Child)

class ChildSerializer(ModelSerializer):
    class Meta:
        model = Child

class ParentSerializer(ModelSerializer):
    # phone_number relation is automatic and will accept ID integers
    children = ChildSerializer() # this one will not

    class Meta:
        model = Parent

问题答案:

最好的解决方案是使用两个不同的字段:一个用于读取,另一个用于写入。如果不做一些繁重的工作,就很难在一个领域中获得想要的东西。

只读字段将是你的嵌套序列化器(ChildSerializer在这种情况下),它将使你能够获得与期望的相同的嵌套表示形式。大多数人将其定义为just child,因为到此为止他们已经编写了前端,更改它会引起问题。

只写字段将是PrimaryKeyRelatedField,这是你通常用于根据对象的主键分配对象的字段。这不必是只写的,特别是如果你试图在接收到的内容和发送的内容之间保持对称性时,但这听起来可能最适合你。该字段应具有外键字段的source集合(child在此示例中),以便在创建和更新时对其进行正确分配。



 类似资料:
  • 但它返回一个id为空且产品为空的对象。当然,我不需要为这个简单的操作编写自定义的吗?

  • 问题内容: 我正在使用django rest框架来创建API。我有以下型号: 为类别创建序列化器: …这将为我提供: 我将如何从Item序列化程序获得相反的结果,即: 我已经阅读了有关其余框架的反向关系的文档,但这似乎与非反向字段的结果相同。我是否缺少明显的东西? 问题答案: 只需使用相关字段而不进行设置。 请注意,这也是因为你想要将输出命名为,而实际字段是,因此需要source在序列化程序字段上

  • 考虑: 如果我们序列化Foo(),输出是: 我想要: 最干净的方法是什么?

  • 一套 RESTful Web API,最基本的要求就是能为调用该 API 的客户端提供符合要求的数据类型,而能否提供符合要求的数据类型,序列化器是关键。上一节中,我们通过短短 6 行代码,构建了一个序列化器,那么序列化器是如何工作的呢?这一节,我们就带领大家手动构建一个序列化器,并深入介绍序列化器的详细使用方法。 1. 构建序列化器 我们在已有的一个数据库模型类 StudentsInfo: # m

  • 我对对象接口的jackson序列化有问题。 我有课 哪个实现 还有上课 哪个实现 上课 我要和Jackson连载Container得到结果 但事实上我得到了结果 尽管我在映射中指定了点的序列化类型(),但在嵌套对象“point”中具有属性“name”。接口点视图没有方法getName,但结果中存在点的字段“name”。 若我从类容器中的方法getMap中删除注释(),我将得到结果 现在点没有属性"