首页 > 解决方案 > 如何获取模型中所有属性的列表 - Django Rest Framework

问题描述

我正在尝试获取所有名称、电子邮件和电话的列表,而无需为每个名称、电子邮件和电话编写类似的类。有没有办法为此目的编写一个通用类?我有意识地使用了 APIView 和 Serializer(而不是 ModelSerializer)。这是我的代码。

视图.py

class userInfoList(APIView):

def get(self, request, format=None):
    users = userInfo.objects.all()
    serializer = userInfoSerializer(users, many=True)
    return Response(serializer.data)

序列化程序.py

from phonenumber_field.serializerfields import PhoneNumberField
from rest_framework import serializers
from .models import userInfo

class userInfoSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=50)
    email = serializers.EmailField(max_length=70)
    phone = PhoneNumberField()

    def create(self, validated_data):
        return userInfo.objects.create(**validated_data)

    

标签: pythondjangolistdjango-rest-frameworkdjango-views

解决方案


看看 DRF 中的通用视图 - https://www.django-rest-framework.org/api-guide/generic-views/

可以为 a 定义 a serializer_classgeneric.ListView因此您可以为您的模型拥有一个基本序列化程序,以及三个具有您感兴趣的字段的子序列化程序:


class BaseSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=50)
    email = serializers.EmailField(max_length=70)
    phone = PhoneNumberField()

    ...

# Here is your sub-serializer
class EmailSerializer(BaseSerializer):
    class Meta:
         fields = ["email"]

# Here is your separate view for retrieving only emails:

class FetchEmailsView(generic.ListView):
    serializer_class = EmailSerializer
    queryset = userInfo.objects.all()


推荐阅读