首页 > 解决方案 > 为什么我的 slug 相关字段在 Django 中显示用户对象(1)而不是建议的字段名称?

问题描述

我写了一个名为credentials. 模型、序列化器和视图是:

models.py

from django.db import models

class Users(models.Model):
    username = models.CharField(max_length=20, blank=False)
    inserted_timestamp = models.DateTimeField(auto_now_add=True)
    class Meta:
        ordering = ('inserted_timestamp',)

class UsersDetails(models.Model):
    user = models.ForeignKey(
        Users,
        related_name='id_user_details',
        on_delete=models.DO_NOTHING,
    )
    user_title = models.CharField(max_length=30, blank=True)
    user_first_name = models.CharField(max_length=25, blank=True)
    user_last_name = models.CharField(max_length=40, blank=True)
    user_birthdate = models.DateField(blank=False)
    inserted_timestamp = models.DateTimeField(auto_now_add=True)
    details_creator = models.ForeignKey(
        Users,
        related_name='dtlcreator_user_details',
        on_delete=models.DO_NOTHING,
        # default=1
        )
    class Meta:
        ordering = ('user_id',)

class UsersPasswords(models.Model):
    user = models.ForeignKey(
        Users,
        related_name='id_user_password',
        on_delete=models.DO_NOTHING)
    salt = models.CharField(max_length=200, blank=True)
    pwdhash = models.CharField(max_length=200, blank=True)
    inserted_timestamp = models.DateTimeField(auto_now_add=True)
    pwd_creator = models.ForeignKey(
        Users,
        related_name='pwdcreator_user_details',
        on_delete=models.DO_NOTHING)
    class Meta:
        ordering = ('user_id',)

这里是serializers.py

from rest_framework import serializers
from credentials.models import Users
from credentials.models import UsersDetails
from credentials.models import UsersPasswords

class UsersSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Users
        fields = (
            'url',
            'pk',
            'username',
            'inserted_timestamp',
            )

class UsersDetailsSerializer(serializers.HyperlinkedModelSerializer):
    user = serializers.SlugRelatedField(
        queryset=Users.objects.all(),
        slug_field='username',
    )
    details_creator = serializers.SlugRelatedField(
        queryset=Users.objects.all(),
        slug_field='username',
    )
    class Meta:
        model = UsersDetails
        fields = (
            'url',
            'pk',
            'user',
            'user_title',
            'user_first_name',
            'user_last_name',
            'user_birthdate',
            'inserted_timestamp',
            'details_creator'
        )

class UsersPasswordsSerializer(serializers.HyperlinkedModelSerializer):
    user = serializers.SlugRelatedField(
        queryset=Users.objects.all(),
        slug_field='username'
    )
    pwd_creator = serializers.SlugRelatedField(
        queryset=Users.objects.all(),
        slug_field='username'
    )
    class Meta:
        model = UsersPasswords
        fields = (
            'pk',
            'user',
            'salt',
            'pwdhash',
            'inserted_timestamp',
            'pwd_creator'
            )

class UsersDetailsPasswordsSerializer(serializers.HyperlinkedModelSerializer):
    details = UsersDetailsSerializer(many=True, read_only=True)
    passwords = UsersPasswordsSerializer(many=True, read_only=True)
    class Meta:
        model = Users
        fields = (
            'url',
            'pk',
            'username',
            'inserted_timestamp',
            'details',
            'passwords',
            )

views.py

from rest_framework import generics
from rest_framework.response import Response
from rest_framework.reverse import reverse
from credentials.models import Users, UsersDetails, UsersPasswords
from credentials.serializers import UsersSerializer, UsersDetailsSerializer, UsersPasswordsSerializer

class UserList(generics.ListCreateAPIView):
    queryset = Users.objects.all()
    serializer_class = UsersSerializer
    name = 'users-list'

class UserDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Users.objects.all()
    serializer_class = UsersSerializer
    name = 'users-detail'

class UserDetailsList(generics.ListCreateAPIView):
    queryset = UsersDetails.objects.all()
    serializer_class = UsersDetailsSerializer
    name = 'usersdetails-list'

class UserDetailsDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = UsersDetails.objects.all()
    serializer_class = UsersDetailsSerializer
    name = 'usersdetails-detail'

class UserPasswordsList(generics.ListCreateAPIView):
    queryset = UsersPasswords.objects.all()
    serializer_class = UsersPasswordsSerializer
    name = 'userpasswords-list'

class UserPasswordsDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = UsersPasswords.objects.all()
    serializer_class = UsersPasswordsSerializer
    name = 'userpasswords-detail'

class ApiRoot(generics.GenericAPIView):
    name = 'api-root'
    def get(self, request, *args, **kwargs):
        return Response({
            'user-list': reverse(UserList.name, request=request),
            'user-details': reverse(UserDetailsList.name, request=request),
            'user-passwords': reverse(UserPasswordsList.name, request=request),
        })

当我打算添加新的用户详细信息时,我希望看到username字段值,但我看到用户对象 (1) 插入用户名,如下图所示:

蛞蝓相关领域

你的想法是什么?

标签: djangopython-3.xdjango-rest-framework

解决方案


设置__str__方法Users

class Users(models.Model):
    ...

    def __str__(self):
        return self.username

推荐阅读