#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
. представление. `