我正在尝试DRF的教程,并且发现了一些困惑。 我有一个简单的扩展auth.User这样django rest框架如何定义每个ViewSet操作需要的字段
class User(DefaultUser):
"""
Represents a registered User
"""
EMAIL_VALIDATOR_LENGTH = 6
email_validated = models.BooleanField(default=False)
# using a 6-digit numbers for email validation
email_validator = models.CharField(
max_length=6,
default=_get_random_email_validator(EMAIL_VALIDATOR_LENGTH),
editable=False
)
phone_number = models.CharField(validators=[phone_regex],
blank=True, null=True, max_length=64)
# country is required
country = models.ForeignKey('Country', null=False, blank=False)
# subdivision is optional
subdivision = models.ForeignKey('Subdivision', null=True, blank=True)
然后,我有我的基本UserSerializer用户模式:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'email', 'password', 'email_validated',
'email_validator', 'country', 'subdivision', 'phone_number',
'last_login', 'is_superuser', 'username', 'first_name',
'last_name', 'is_staff', 'is_active', 'date_joined')
在我的views.py,我有UserViewSet:
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
@detail_route(methods=['get', 'post'], url_path='validate-email')
def validate_email(self, request, pk):
user = self.get_object()
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
user.is_active = True
user.save()
return Response({'status': 'email validated'})
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@detail_route(methods=['post'], url_path='set-password')
def set_password(self, request, pk):
pass
@list_route()
def test_list_route(self, request):
pass
问题是,在validate_email中,我实际上只需要pk,但是当我测试API时,它告诉我用户名和电子邮件也是必需的。
我加入以下代码,以我的UserSerializer
extra_kwargs = {'country': {'required': False},
'password': {'required': False},
'username': {'required': False},
}
现在上面的问题没有了,但是当我试图创建一个用户,其实我想需要用户名和电子邮件。
有没有一种方法可以指定每个操作需要哪些字段? 例如,对于我的set_password(),我想要求密码字段。
谢谢,
感谢您的回复,但我认为它不起作用。我将下面的代码添加到我的UserSerializer中,它仍然需要用户名:self.fields ['username']。require = False –