私はDRFからチュートリアルを試しています。 私は単に私が私の基本的なUserSerializer持っその後、このdjango rest framework 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)
ようauth.Userを拡張Userモデルがあります:私のviews.pyで
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')
を、私は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に次のコードを追加しても、それでもusernameが必要です:self.fields ['username']。require = False –