【发布时间】:2016-12-04 23:20:53
【问题描述】:
我正在尝试 DRF 的教程,但我发现有些困惑。 我有一个 User 模型,它只是像这样扩展 auth.User
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(),我想要求密码字段。
谢谢,
【问题讨论】:
标签: python django django-rest-framework