【问题标题】:'Users' object has no attribute 'values' django rest framework'用户'对象没有属性'值'django rest框架
【发布时间】:2021-04-28 23:24:00
【问题描述】:

我在使用连接表序列化数据时遇到问题。我这样做对吗?我只是 django 的新手。

这是我的models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser

class Agency(models.Model):
    agency_id = models.CharField(primary_key=True, max_length=50)
    agency_shortname = models.CharField(max_length=20, blank=True, null=True)
    agency_longname = models.CharField(max_length=255, blank=True, null=True)
    date_created = models.DateTimeField(blank=True, null=True)

        class Meta:
            managed = False
            db_table = 'agency'

class Users(AbstractBaseUser):
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = []
    user_id = models.CharField(primary_key=True, max_length=50)
    first_name = models.CharField(max_length=50, blank=True, null=True)
    middle_name = models.CharField(max_length=50, blank=True, null=True)
    last_name = models.CharField(max_length=50, blank=True, null=True)
    username = models.CharField(unique=True, max_length=50, blank=True, null=True)
    password = models.CharField(max_length=100, blank=True, null=True)
    agency = models.OneToOneField(Agency, models.DO_NOTHING)
    date_created = models.DateTimeField(blank=True, null=True)
    active = models.CharField(max_length=8)
    login_status = models.CharField(max_length=6)
    last_login = models.DateTimeField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'users'

然后在我的 serializers.py 中

   from rest_framework import serializers
   from .models import Users, Agency

   class UserDetailSerializer(serializers.ModelSerializer):
       class Meta: 
           model = Users
           fields = '__all__'

   class AgencyDetailSerializer(serializers.ModelSerializer):
       agency_id = UserDetailSerializer()
       class Meta:
           model = Agency
           fields = ['agency_id','agency_shortname','agency_longname']

还有我的观点.py

   from rest_framework.decorators import api_view, permission_classes
   from rest_framework.response import Response
   from .serializers import UserDetailSerializer
   from .models import Users, Agency
   from rest_framework.permissions import IsAuthenticated

   @api_view(['GET'])
   @permission_classes([IsAuthenticated])
   def userData(request):
       username = request.GET.get('username')
       r_type    = request.GET.get('type')

       user = Users.objects.get(username=username).values('user_id','first_name','middle_name','last_name','username','email','agency__agency_id','agency__agency_shortname','agency__agency_longname')
       user_serializer = UserDetailSerializer(user, many=False)

       return Response(user_serializer.data)

我收到了'Users' object has no attribute 'values' 的错误,这似乎是什么问题?我正在使用 vue.js 和 django rest 框架构建基于 api 的应用程序。非常感谢

【问题讨论】:

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


    【解决方案1】:

    get 查询集没有values 属性,而是使用filter

    user = Users.objects.filter(username=username).values(...)
    

    关于你的情况,使用 get 就足够了,像这样自定义你的序列化器:

    class UserDetailSerializer(serializers.ModelSerializer):
        class Meta: 
            model = Users
            fields = '__all__'
        agency = AgencyDetailSerializer(many=False, read_only=True)
    

    【讨论】:

    • 我试过了,但它说,You passed a Serializer instance as data, but probably meant to pass serialized .data` 或 .error。表示。`
    • 对于你的情况,只需要使用get,然后使用Serializer来显示响应就足够了!无需使用values
    • 但它不返回来自Agency模型的字段
    • 刚刚更新了我的答案,您需要自定义您的序列化程序以获取Agency 数据
    • 我可以问一个问题吗? `SELECT * FROM table WHERE col = 'Foo' 的 .get(col='Foo') 等效查询吗?
    【解决方案2】:

    因为值不是模型对象的属性。您可以在 queryset 对象上调用值。类似:

    user = Users.objects.filter(username=username).values('user_id','first_name','middle_name','last_name','username','email','agency__agency_id','agency__agency_shortname','agency__agency_longname')
    

    注意:不需要调用values,只需将此行改为:

       from rest_framework.generics import get_object_or_404
    
       ...
       user = get_object_or_404(Users, **dict(username=username))
       user_serializer = UserDetailSerializer(user)
       ...
    

    因为序列化程序本身会为您处理。

    【讨论】:

    • 出现此错误,You passed a Serializer instance as data, but probably meant to pass serialized .data` 或 .error。表示。`
    猜你喜欢
    • 2017-06-17
    • 2018-03-30
    • 2017-08-11
    • 2016-06-30
    • 2015-07-14
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多