django - 为什么我的 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) 插入用户名,如下图所示:
你的想法是什么?
解决方案
设置__str__
方法Users
:
class Users(models.Model):
...
def __str__(self):
return self.username
推荐阅读
- c++ - 尝试覆盖 -= 运算符时遇到问题
- ruby-on-rails - 自定义模块配置块并不总是有效
- oracle - 如何在 Oracle 身份管理器中为电话号码、姓氏等用户详细信息指定自定义验证?
- python - 从收件箱中获取电子邮件时出现 imap EOF 错误
- python - 来自 Kubernetes pod 内的 Docker 容器的缓慢响应
- python - 如何在 conda 虚拟环境下 pip 安装包
- java - 为什么在 Windows 中没有执行 4 分钟睡眠的无限 while 循环的 java 代码?
- regex - 如何在火花数据框中应用预定义的正则表达式模式?
- spring-boot - 为什么我在 CloudFoundry 中缺少 Spring Actuator 2 端点,而相同的设置在本地工作?
- php - 使用php将excel数据导入数据库表