p3ac3
p3ac3

Reputation: 161

'Users' object has no attribute 'values' django rest framework

I'm having a problem with serializing the data with joined tables. Am i doing this right? i'm just a newbie in django.

here's my 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'

Then in my 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']

and my views.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)

I'm getting an error of 'Users' object has no attribute 'values', what seems be the problem? i'm building api based application with vue.js and django rest framework. Thanks a lot

Upvotes: 2

Views: 4857

Answers (2)

Vu Phan
Vu Phan

Reputation: 584

get queryset does not have values attribute, using filter instead.

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

Regarding your case, using get is enough and custom your Serializer like this:

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

Upvotes: 4

Roham
Roham

Reputation: 2110

Because values is not an attribute of model object. You can call values on queryset object. something like:

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

Note: You don't need to call values, just change this line to:

   from rest_framework.generics import get_object_or_404

   ...
   user = get_object_or_404(Users, **dict(username=username))
   user_serializer = UserDetailSerializer(user)
   ...

Because serializer itself will handle it for you.

Upvotes: 1

Related Questions