开发者社区> 问答> 正文

如何从数据库为Django Rest Framework中的登录用户返回数据?

场景:

我目前有两个API。一个RegisterAPI和一个LoginAPI。RegisterAPI注册一个新用户,而LoginAPI仅允许他们访问其详细信息。我也使用了JWT身份验证。

我想从数据库中检索使用DRF中的Login API登录的特定用户的数据。我的意图是与数据库进行交互,但是问题是我的序列化器中有两个模型具有一对一关系,而我对如何继续解决此问题感到困惑。为了获得更清晰的图片,请在下面查看我的代码:

models.py:

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

class UserData(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    company = models.CharField(max_length=100, blank=True, null=True)
    address = models.TextField()

views.py:

class RegisterAPI(APIView):
    permission_classes = [AllowAny]
    def post(self, request, format=None):
        serializer = UserDataSerializer(data=request.data)
        if serializer.is_valid():
            content = {
            'status': 'Thanks for registering'}
            return Response(content, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class LoginAPI(viewsets.ModelViewSet):
    permission_classes = [IsAuthenticated]
    def list(self, request, *args, **kwargs):
        user_id = request.user.id
        queryset = User.objects.filter(user = request.user)
        user_serializer = UserSerializer(queryset, many = True)
        return Response(user_serializer.data)

serializers.py:

from rest_framework import serializers
from users.models import UserData
from django.contrib.auth.models import User 

class UserDataSerializer(serializers.ModelSerializer):
    class Meta:
        model = userData
        fields = ('company', 'address')

class UserSerializer(serializers.ModelSerializer):
    info = UserDataSerializer()

    class Meta:
        model = User
        fields = ('username', 'email', 'password', 'info')

    def create(self, validated_data):
        p_data = validated_data['info']
        password = validated_data['password', None]  
        user = User.objects.create(**validated_data)
        if password is not None:
            user.set_password(password)
        user.save() 
        Profile.objects.create(user = user, **p_data)
        return validated_data

urls.py:

from rest_framework.routers import DefaultRouter
from users.views import LoginAPI, RegisterAPI

router = DefaultRouter()
router.register('login_api', LoginAPI, basename = 'login_api')

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(router.urls)),  
    path('register_api/', RegisterAPI.as_view(), name = 'register_api'),
]

我想在LoginAPI中返回用户的用户名,电子邮件,公司和地址。这些都来自用户和配置文件模型。

例:

{'username' = 'Tim',
 'email' = 'tim@company.com',
 'company' = 'Riko',
 'address' = 'Kenya'}

但是,访问Login API URL时,无法从User模型和Profile模型中检索记录。

我收到此错误:

AttributeError at /login_api/
Got AttributeError when attempting to get a value for field `info` on serializer `UserSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `User` instance.
Original exception text was: 'User' object has no attribute 'info'.**

谁能向我解释哪里出了问题?

展开
收起
几许相思几点泪 2019-12-05 15:19:46 559 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载
云时代的数据库技术趋势 立即下载
超大型金融机构国产数据库全面迁移成功实践 立即下载