2014-11-03 118 views
1

我已经将模型序列化为具有外键的JSON。该API将显示外键的标题,但不会嵌套属于该外键的数据。我该怎么做呢。Django Rest框架:如何显示JSON中的外键内容

serializers.py

class ReportFieldSerializers(serializers.ModelSerializer): 
    form = serializers.RelatedField() 
    class Meta: 
     model = ReportField 
     fields = (
      'id', 
      'title', 
      'form' 
     ) 

api.py

class ReportFieldList(APIView): 
    def get(self, request, format=None): 
     report_field = ReportField.objects.all() 
     serialized_report_field = ReportFieldSerializers(report_field, many=True) 
     return Response(serialized_report_field.data) 

class ReportFieldDetail(APIView): 
    def get_object(self, pk): 
     try: 
      return ReportField.objects.get(pk=pk) 
     except ReportField.DoesNotExist: 
      raise Http404 

    def get(self, request, pk, format=None): 
     report_field = self.get_object(pk) 
     serialized_report_field = ReportFieldSerializers(report_field) 
     return Response(serialized_report_field.data) 

models.py

class Report(models.Model): 
    title = models.CharField() 
    form = models.ForeignKey() 

class Form(models.Model): 
    # Form details 
+0

您已经在serializers.py ReportField,但在你的models.py模型报告。你能否纠正一下,以反映你的实际代码。 – cezar 2014-11-03 19:43:07

回答

1

有一个选项depth,可以在元类的使用串行器。例如:

class ReportFieldSerializers(serializers.ModelSerializer): 

    class Meta: 
     model = ReportField 
     fields = (
      'id', 
      'title', 
      'form' 
     ) 
     depth = 1 

这将在相关型号中下移一步。正如你所见,你不需要RelatedField。如果,比方说,将有第三个模型类,例如:

class Form(models.Model): 
    example = ForeignKey('AnotherModel') 

class AnotherModel(models.Model): 
    # model fields 

,你也可以使用depth=2ReportFieldSerializer显示此模型的信息。

我假设在你的模型Report的字段form显示为Formmodels.ForeignKey(Form)

我已经回答了类似的问题在这里: Django rest_framework serializer with inner relationship

+0

这帮了我。是否可以删除外键的'id'字段?或者我看错了方向?我是django的新手,我认为它会在外部模型的序列化程序中隐藏'id'字段,如果从另一个对象中取出它,它也将被显示。有没有我失踪的理由?它可能是用于访问? – yev 2017-05-07 03:29:45