title: How can I use `email` in "django-rest-framework-simplejwt" instead of `username` to generate token?
body: <p>In django-rest-framework-simplejwt plugin <code>username</code> and <code>password</code> are used by default. But I wanted to use <code>email</code> instead of <code>username</code>. So, I did like below:</p>
  
  <p><strong>In serializer:</strong></p>
  
  <pre><code>class MyTokenObtainSerializer(Serializer):
      username_field = User.EMAIL_FIELD
  
      def __init__(self, *args, **kwargs):
          super(MyTokenObtainSerializer, self).__init__(*args, **kwargs)
  
          self.fields[self.username_field] = CharField()
          self.fields['password'] = PasswordField()
  
      def validate(self, attrs):
          # self.user = authenticate(**{
          #     self.username_field: attrs[self.username_field],
          #     'password': attrs['password'],
          # })
          self.user = User.objects.filter(email=attrs[self.username_field]).first()
          print(self.user)
  
          if not self.user:
              raise ValidationError('The user is not valid.')
  
          if self.user:
              if not self.user.check_password(attrs['password']):
                  raise ValidationError('Incorrect credentials.')
          print(self.user)
          # Prior to Django 1.10, inactive users could be authenticated with the
          # default `ModelBackend`.  As of Django 1.10, the `ModelBackend`
          # prevents inactive users from authenticating.  App designers can still
          # allow inactive users to authenticate by opting for the new
          # `AllowAllUsersModelBackend`.  However, we explicitly prevent inactive
          # users from authenticating to enforce a reasonable policy and provide
          # sensible backwards compatibility with older Django versions.
          if self.user is None or not self.user.is_active:
              raise ValidationError('No active account found with the given credentials')
  
          return {}
  
      @classmethod
      def get_token(cls, user):
          raise NotImplemented(
              'Must implement `get_token` method for `MyTokenObtainSerializer` subclasses')
  
  
  class MyTokenObtainPairSerializer(MyTokenObtainSerializer):
      @classmethod
      def get_token(cls, user):
          return RefreshToken.for_user(user)
  
      def validate(self, attrs):
          data = super(MyTokenObtainPairSerializer, self).validate(attrs)
  
          refresh = self.get_token(self.user)
  
          data['refresh'] = text_type(refresh)
          data['access'] = text_type(refresh.access_token)
  
          return data
  </code></pre>
  
  <p><strong>In view:</strong></p>
  
  <pre><code>class MyTokenObtainPairView(TokenObtainPairView):
     """
      Takes a set of user credentials and returns an access and refresh JSON web
      token pair to prove the authentication of those credentials.
     """
      serializer_class = MyTokenObtainPairSerializer
  </code></pre>
  
  <p>And it works!!</p>
  
  <p>Now my question is, how can I do it more efficiently? Can anyone give suggestion on this? Thanks in advance.</p>