Объект «Пользователи» не имеет атрибута «значения» django rest framework

#python #django #django-models #django-rest-framework #django-serializer

#python #django #django-модели #django-rest-framework #django-сериализатор

Вопрос:

У меня проблема с сериализацией данных с помощью объединенных таблиц. Правильно ли я это делаю? я просто новичок в 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']
 

и мой 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)
 

Я получаю сообщение об ошибке 'Users' object has no attribute 'values' , в чем проблема? я создаю приложение на основе api с vue.js и фреймворк django rest. Большое спасибо

Ответ №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)
 

Комментарии:

1. я пробовал, но он сказал, You passed a Serializer instance as data, but probably meant to pass serialized .data` или .error . представление. `

2. Что касается вашего случая, просто нужно использовать get , затем достаточно использовать сериализатор для отображения ответа! нет необходимости использовать values

3. но он не возвращает поля из Agency модели

4. Просто обновил мой ответ, вам нужно настроить свой сериализатор для получения Agency данных

5. могу я задать вопрос? есть ли .get(col=’Foo`) эквивалентный запрос ‘SELECT * ИЗ таблицы, ГДЕ 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')
 

Примечание: вам не нужно вызывать значения, просто измените эту строку на:

    from rest_framework.generics import get_object_or_404

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

Потому что сам сериализатор обработает это за вас.

Комментарии:

1. Появилась эта ошибка, You passed a Serializer instance as data, but probably meant to pass serialized .data` или .error . представление. `