如何在 Django rest 框架中显示外键数据?

How to Show Foreign Key data in Django rest framework?

型号:

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 } 它正在保存,但保存后它是 return 相同的响应,但我希望用户 first_name, last_name, and email 在 return 响应中。

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

如果我增加 depthSerializer 这会在节省时间方面造成问题,但在获取记录时我会获取 User 模型的所有详细信息。喜欢密码也作为回应所以这对我来说是一个安全问题显示所有东西。

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

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

另一方面,Retrieve serializer 将使用 Nested Relationship 使用不同的序列化程序序列化 User。

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

由于您不想包含 User 模型的所有字段,您将不得不使用另一个序列化程序编写 User 的最小表示。

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

希望对您有所帮助。

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

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