在Django Serializer

时间:2016-10-12 12:55:44

标签: python django ember.js django-rest-framework json-api

我们说我有一些模特:

class A(models.Model):
    ...

class B(models.Model):
    my_reference_to_a = models.ForeignKey(A)
    b_field_1 = ...
    b_field_2 = ...

class C(models.Model):
    my_reference_to_b = models.ForeignKey(B)
    c_field_1 = ...
    ...

在我C的序列化程序中,我想要包含C中的所有字段,B中的所有字段以及A中的B引用B(但不是C中对{ "data": [{ "type": "C", "id": "1", "attributes": { "b_field_1": "...", "b_field_2": "...", "c_field_1": "..." }, "relationships": { "a": { "data": { "type": "A", "id": "1" } } } }], ... } 的引用),因此JSON API输出将是这样的:

C

我该怎么做?我已经尝试在A = ASerializer(source='my_reference_to_b.my_reference_to_a') 的序列化程序中执行类似的操作:

"a": {
    "data": null
}

但这并不起作用,因为DRF似乎不支持源的虚线路径。我还尝试提供一个返回正确模型的方法(模型在方法内部有效)作为源,但是它将JSON中的引用输出为:

A

在我的D模型上,我还引用了另一个模型A,该模型未在D中明确说明,而是在D中定义为一个OneToMany关系(许多A模型到一个D模型),在C中声明的ForeignKey上有一个resource_name,并试图在D = DSerializer(source='B.D')中引用它以包含该关系JSON也不起作用。我收到此错误(尝试通过执行'RelatedManager' object has no attribute 'B' 来引用它):

public activeUser = new BehaviorSubject(null);

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我明白了。如果有人登陆此页面并且需要帮助,请回答我自己的问题。

您需要使用Django Rest Framework JSON API中的SerializerMethodResourceRelatedField。我没有尝试过常规的ResourceRelatedField,查看源代码向我展示了ResourceRelatedField不支持虚线路径。而是使用SerializerMethodResourceRelatedField,其源代码指向返回所需关系的方法。