【问题标题】:How to Show Foreign Key data in Django rest framework?如何在 Django REST 框架中显示外键数据?
【发布时间】:2019-07-24 02:57:40
【问题描述】:

型号:

class Demo(models.Model):
    name = models.CharField(max_length=255)
    desc = models.TextField()
    user = models.ForeignKey('auth.User', on_delete=models.CASCADE)

序列化器:

class DemoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Demo
        fields = '__all__'

我在前端添加了name, desc and assigning to User 的表单,所以我遇到了一个问题。

我正在将数据传递给 API {name: "demo", desc: "lorem ipsum", user: 1 } 它正在保存,但保存后返回相同的响应,但我希望用户 first_name, last_name, and email 作为返回响应。

因为我有一个显示演示表内容列表的表格。但总是只得到User ID 而不是用户的详细信息。

如果我增加了depthSerializer,这会在保存时间方面造成问题,但在获取记录时间时,我将获得User 模型的所有详细信息。像密码一样也响应,所以这对我来说是一个安全问题显示所有东西。

【问题讨论】:

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


    【解决方案1】:

    可以使用depth = 1获取外键对象的所有数据:

    class DemoSerializer(serializers.ModelSerializer):
        class Meta:
            model = Demo
            fields = '__all__'
            depth = 1
    

    【讨论】:

      【解决方案2】:

      您可以将 Create 和 Retrieve 序列化程序分开。例如,创建序列化程序将是您当前使用的序列化程序:

      class DemoCreateSerializer(serializers.ModelSerializer):
          class Meta:
              model = Demo
              fields = '__all__'
      

      另一方面,Retrieve 序列化器将使用 Nested Relationship 使用不同的序列化器序列化用户。

      class DemoRetrieveSerializer(serializers.ModelSerializer):
          user = UserMinimalSerializer # or you could use your UserSerializer, see the last part of the answer
          class Meta:
              model = Demo
              fields = ('id', 'name', 'desc', 'user')
              read_only = ('id', 'name', 'desc', 'user',)
      

      在您看来,您将使用第一个序列化程序创建数据并使用第二个序列化程序进行响应。一个使用APIView的例子:

      class DemoView(APIView):
          def post(self, request, format=None):
              create_serializer = DemoCreateSerializer(data=request.data)
              if create_serializer.is_valid():
                  instance = create_serializer.save()
                  retrive_serializer = DemoRetrieveSerializer(instance)
                  return Response(retrive_serializer.data, status=status.HTTP_201_CREATED)
              return Response(create_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
      

      您可能必须自定义 DRF 提供的视图才能实现此目的,即对于 Generic views

      由于您不想包含用户模型的所有字段,因此您必须使用另一个序列化程序编写用户的最小表示。

      class UserMinimalSerializer(serializers.ModelSerializer):
          class Meta:
              model = User
              fields = ('id', 'first_name', 'last_name', 'email')
              read_only = ('id', 'first_name', 'last_name', 'email',)
      

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-19
        • 2017-03-27
        • 2021-12-09
        • 2015-12-07
        • 2017-11-02
        相关资源
        最近更新 更多