【问题标题】:How to get a list of all attributes in model -Django Rest Framework如何获取模型中所有属性的列表 - Django Rest Framework
【发布时间】:2021-02-16 10:53:13
【问题描述】:

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

views.py

class userInfoList(APIView):

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

serializers.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)

    

【问题讨论】:

  • 为什么要覆盖更新方法?
  • @ruddra 我没有在这里包含我的所有代码。我正在为每个用户使用 put、delete 功能
  • 您在寻找什么?你的代码不工作吗?
  • @VineetYadav 我只是不想获取每个用户的所有信息。我还想单独获取所有电子邮件或所有姓名
  • 如果您提供一个您寻求的响应示例会更好,就像我理解您需要的是:{data:[{'id':1,'name':'u1','电子邮件':'email1','电话':'phone1'},{'id':2,'名称':'u2','电子邮件':'email2','电话':'phone2'}],' all_emails':['email1','email2'],'all_names':['u1','u2'],'all_phone':['phone1','phone2']}。对吗?

标签: python django list django-rest-framework django-views


【解决方案1】:

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

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


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()

【讨论】:

  • 我收到如下错误:TemplateDoesNotExist: api/userinfo_list.html
  • @mooncake,抱歉误导,但我的意思是来自 DRF 的 generics.ListCreateAPIView 模块,而不是 django.views.generic.ListView - 这可能是你得到模板不存在错误的原因
  • 'm 不仅检索电子邮件,还检索所有其他属性。我的 get() 方法的结果相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 2017-12-12
  • 2021-01-10
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
相关资源
最近更新 更多