Make組ブログ

Python、Webアプリや製品・サービス開発についてhirokikyが書きます。

ヒヨッコの僕たちはこうして新規プロダクトPyQを企画・開発・販売しました

ヒヨッコの僕たちはこうして新規プロダクトPyQを企画・開発・販売しました

f:id:hirokiky:20170807211628p:plain

今日、4月12日は何の日でしょうか? 久々に晴れて気持ちが良かった日?それももちろんそうですが違います。

今日は PyQ の正式リリースの日です!

こんにちは。@hirokikyです。 これはヒヨッコだった僕が、僕たちが1年で勉強した、製品の企画、開発、価格戦略マーケティング戦略の話です。 チームのみんなで勉強して奮闘した1年でした。

自信過剰のヒヨッコ、ky

僕は自信たっぷりでしたが、ヒヨッコでした。 僕は今までも自分で PileMd を作ったり、 PythonDjangoでお仕事してきたりと自分と製品づくりには結構自身がありました。

でも

  • 「ホントウに人が欲しい価値あるものを作る」
  • 「何かを作ってお金をいただいて、そのお金でもっといいものを作る」
  • 「作ったものを求める人に届ける」

ということはできませんでした。今思えば。 エンジニアとして自信があっても、ホントウに求められる製品を作る方法とか、値段の付け方とか、宣伝の仕方とか分からなかったです。

たぶん、これができる人はすごいと思います。できたら起業しろって、そういうレベルですね。

正直分からない。。。どこで学べば良いのかも分からない。。。 実際「新規の事業を企画して開発して売る」まで一気通貫でできる機会って少ないんですよね (そりゃ毎日何かがリリースされてたらチョット忙しいですよね)。

で、僕は全くその辺を知らなかったんですが1年 PyQ_ を通して学んだことを書きたいなと思います。 数人の少ないチームのみんなで勉強しながらここまでやってきました。大変でしたがチームも、会社自体も成長できたと思います。 (これからもみんなでやっていこうな!)

今日、リリース時のテンションで書いてるので、雑筆なのは許してください。

製品の企画!どんな価値を提供するの?

さて「新しいビジネスをやるぞ!」と意気込んでも何を作るんでしょう。 とりあえずで「ブルーオーシャンを狙った」自分でもよく分からない物を作ったことある人は僕だけじゃないはずです。ありますよね?

まずは、何をつくるかを決めましょう。どうやって?

PyQではまずharuさんの思いから始まりました。平たく言うと 「技術の底上げをしたい。多くの人はプログラミングとかの技術に興味があるし今後も人が増えるけどできない。人材の紹介とかパイの取り合いはやってるけどパイを増やすことができていない」 という思いから始まります。

でもそれだけだと何にもならないですよね。これを育てていかないといけません。

僕は1年前にこの企画に入ります。それまでは同僚のかめちゃんが1人でプロトタイプとかを作って、haruさんshinさんと模索している段階でした。 入ったときは今の PyQ_ の原型もほぼなくて、SQLを学ぶプラットフォームだったりしました。 僕が入る中で「この製品はいけてないな」とかエラそうなことを言います。 そこで僕もプロトタイプに入って、コンテナー技術でうまく学習プラットフォームを提供する仕組みを作ります。

でもやっぱり何か違う。 何をつくるかってどうやって決めるんでしょう?

そこで4人(haru, shin, kameko, 僕ky)で企画から練り直すことになりました。 一旦みんなで本を読んで、ひたすらそれを元に僕たちのストーリーは何かと話しました。

ここで、参考になる本をお伝えします。

この本では事業のストーリーを練って価値あるものにしていこうということが書かれています。 この中でPyQというものが見えてきました

  • Pythonを使うこと。Pythonを徹底的に学べること
  • BeProudの知見を最大限盛り込むこと
  • BeProudの他事業(研修事業など)と連携すること
  • オンラインで学べること

が大まかに見えてきます。ストーリーも浮かび上がってきます。 おぉ、これはすごいぞと。

そこからさらに踏み込んで、ステークホルダーの人々、そこにある要求、提供できる価値を見える化していきました。 その方法には匠メソッドという方法を使っています。

匠メソッドは「ステークホルダーは誰か、私たちは何か、で、提供できる価値は何か?」を図に書きながら掘り起こす手法です。 これで、チームで合意を形成しつつ、ぶれない「製品の価値」を定義できます。

これは今BeProudの会社としても、例えば受託でお仕事いただくときもお客さまにとっての価値は何かを見つけるために使っていたりします。 PyQでもこの匠メソッドを使って「使う人、関わる人に取っての価値は何か?」を徹底的に徹底的に掘り下げました。

このプロセスはスピード感はありましたが、延べで1,2ヶ月ほど時間を使っていた記憶です。 でもそのおかげで、全く的はずれな製品に注力することなく価値ある PyQ_ を作れたと思っています。

開発と製品を良くしていく方法

Webアプリ、フロントエンド、インフラ、デザイン、HTML、CSSなどなどの開発は全部僕がやっています。 ので、基本的には僕が「ガッ」と作って皆んなに見てもらってヤイヤイ言い合って、ときにユーザーさんの価値に立ち返って製品を育ててきました。

問題やカリキュラムについてはkamekoが主導して頑張ってくれました。

ここで良かったことをあげます:

  • とにかく速くあげて速くフィードバック貰った
  • 朝会で認識を共有してオンラインで言えないことを言う
  • ベータユーザーさんやアルバイトでお願いしたモニターさん、社員のフィードバックを徹底的に反映する

というスタイルを取っていました。

製品の動き、UXについてもそうですし、問題文の構成や学ばせる手順などもすべてゼロから作る必要があります。 とにかく計画してみて作ってみて、自分たちで使ってみてというのを繰り返していたように思います。

ホントウに、この段階から使ってくれた方のおかげて今の PyQ_ があると思います。 でも大事なのは「フィードバックを真に受けずに作る人間が責任持って価値を提供する」ことだと思います。

ときに、使う人自身が見えてない価値を提供するのが作り手だと思うので、 使う人にはチョット申し訳ないですが、たまに真意だけ受け取って内容をスルーしたりもしました。

大事なのは常に、ユーザーさんにとっての価値を提供することだと思います。

で、いくらでどうやって売るの

おそらくこれがエンジニア的に最大にして最強の壁だと思います。 自社サービスの会社で働こうが、受託の仕事をしようが、自分で値段を決めて自分で広めて使ってもらう機会はなかなかないと思います。

僕も多少はあれど、ガッツリ製品として売っていくことは初めてだったので分からないことだらけでした。 えぇ、もちろんチーム全員としてそうですね。チーム全員、どうすりゃええねんと。

ここでharuoさんが良い本と学習教材、勉強方法はどうかな?やってみない?と提案してくれました。 1つ、学習方法はRead For Actionという方法でチームで本から学んでみよう。 2つ、価格については各自持ち寄った価格に関する本を使ってReadForActionしよう。 3つ、販売については神田昌典氏まわりの本やWeb教材から学んでみよう。

ということでした

この本は参考になりました。

この辺の内容を参考にしつつ、チームでとにかく議論して決めました。 この頃にはLPや広告画像のデザインしてくれたmarippeも加わりなかなかホットなチームでした。

さて、価格において、販売において重要なのは何でしょうか。

色々学んだ中で考えるとやっぱり「お客さんに提供される価値はなんだろう」に尽きると思います。 お客さんに提供される価値から価格を考えたり、提供される価値・喜んでくれる人に対して知ってもらう。ということです。

原価やリソースの費用、稼働時間を元に価格を計算するのでなくて、お客さんに提供される価値を元に値段を決める。 これは大変なことですが、大事な考え方だと思います。

そもそも、お客さんに提供される価値が自分たちに見えていないと価格も決めれないってことですね。

売っていく方法

大々的にPRすればそれで良いでしょうか? Twitterで拡散すればそれでOKでしょうか?

違いますよね。すぐ話題が終わってしまいますし、知り合いがチョット知ってくれて終わりになっちゃいます。

結局、僕もそれまでのチームもコンフォートゾーンから出れてなかった気がします。 自分たちの知り合いや、身近な人しか想像できない狭い世界ですね。

そうじゃなくて、ホントに必要としてくれる人に会って、話して、その人達に使ってもらいたいです。 もちろん知り合いの方にも使っていただいてますし、農婦の方とかもいらっしゃって、今までの自分とは違う世界に来たなと思います。

話が長いので詳しくは割愛します。

神田昌典氏の講座もどうぞ http://www.cp.almacreations.jp/digital/

まとめ

自社で新規の事業を企画、開発、販売するなかで感じたことは

  1. 作れ!
  2. 学べ!
  3. 自分とチームのセンスを信じろ

ですね。

とにかく作らないと見えない。とにかくリリースしないと分からない。それが新規の事業です。ゼロからイチを作ることだと思います。 本だけ読んでエラそうな顔してた僕が言うんだから間違いないです。やれば苦労がイッパイあります。苦労しかない!? そしてとにかくリリースしましょう。リリースされてないコードはゴミです。リリースされて、人に使われて物語は始まります。

あとは今の自分にないものを積極的に学ぶことですね。 うさんくさいオッサンだろうが、マーケッターだろうが営業だろうがマッキンゼーだろうが、僕らにとってはその分野の師匠です。 新鮮な、謙虚な気持ちで弟子入りしましょう。

あと、最後にはやっぱり僕たちの力を信じるしか無いです。 ものを作る間、ホントウに価値があるかなどホントウに気を病みます(僕もメンタルはタフな自信がありましたが逆食と神経性胃炎になりました)。 大事なのは自分のセンスを、自分たちチームを信じることです。最終的には「自分たちが何をするか」です。誰に言われるかでなく。 自分たちの製品、価値、お客さんに責務を持って「調整するのでなく決める」ことが大事です。

以上、他にも勉強になった本は大量にありますし書きたいこともイッパイあります。 まずは、リリースしたテンションで書いてみました。

チームで活動してくれたharuoさん、shinさん、kameちゃん、marippe、esuji氏、shimizukawa先生、john、お疲れ!! ベータユーザーの方、モニターの方、社員の皆さん、協力してくれた人ありがとう。

PyQ_ の物語はまだ始まったばかりだ!(プリンセス・ハオ)

Build, Minify, Merge TypeScript by webassets

Build, Minify, Merge TypeScript by webassets

Today, I introduce webassets to build TypeScript, minify each generated JavaScript, and merge it.

webassets is a media manager written in Python to merge JS, compress JS/CSS, uglifying, and so on. and It also provide the way to coraborate with a veriety of WebFrameworks.

But in this post, you can learn way to build, minify, merge JavaScript from commandline interface by webassets:

Install

First, install webassets and I’ll write config file for the buliding as YAML file. so you also need webassets with PyYAML.

pip install webassets
pip install PyYAML

now you might get webassets==0.9, PyYAML==3.11.

And to minify JavaScripts, install jsmin.

pip install jsmin

Python requiremests are them. And ofcause TypeScript is necessary to bulid them.

npm install -g typescript

now you’d better to check ‘tsc’ command.

OK. let’s make it.

Configuation for building

Now let’s write the configuration file. You can put ‘webassets.yml’ file you want. In this post, I won’t show you how to write it step by step. But I’ll show you a case and it’s sample file, and then, describe each meanings of it.

The case is for building a JavaScript file to a web application. It requires three external libraries (jquery, knockout, and underscore) and files I wrote are written in TypeScript. So you need to compile ts files and merge all of them and also minfy it. The number of TypeScript files is 7, 4 difinition file and 3 application files The config file of this case will be like this:

directory: ./karmaid/static
debug: False
bundles:
  js-karmaid:
    contents:
      - js/lib/jquery-2.1.0.js
      - js/lib/knockout-3.1.0.js
      - js/lib/underscore-1.6.0.js
      - contents:
        - js/app/config.d.ts
        - js/lib/jquery.d.ts
        - js/lib/knockout.d.ts
        - js/lib/underscore.d.ts
        - js/app/api.ts
        - js/app/ko_flushvalue.ts
        - js/karmaid.ts
        filters: typescript
    filters: jsmin
    output: js/karmaid.js
  • directory: : it means the root directory http://webassets.readthedocs.org/en/latest/environment.html#webassets.env.Environment.directory

  • debug: : you can switch it by own enviroments http://webassets.readthedocs.org/en/latest/environment.html#webassets.env.Environment.debug

  • bundles: : you can put own ‘bundles’ under it. Each bundles are corresponding to each output files. so If you want to create JS file for Top page of your application, you may create js_top bundle and write config to merge or minify some Javascript files. In this case only ‘js-karmaid’ is appearing.

  • contents: : the output file will be constructed by each elements of this list. Own elements will be automatically merged and the file written in ‘output’ will be generated. And it can discribe ‘nested bundle’ in it. In this case, each typescript files are in js-karmaid bundle which means these ts files will be builded before minifying and merging each JavaScript files.

  • filters: : Specify to minify, build, uglify and so on.

    -   jsmin is for minifying JavaScript by 'jsmin'
        <https://pypi.python.org/pypi/jsmin>
    -   typescript is for building TypeScript and generating
        JavaScript files. If you use external libraries you also
        need specify difinitely files
        <https://github.com/borisyankov/DefinitelyTyped>
    
    You can learn about all of filters provided by
    [webassets](https://pypi.python.org/pypi/webassets/0.9)
    <http://webassets.readthedocs.org/en/latest/builtin_filters.html>
    

Run command

After making the config. Run the command to build:

webassets -c webassets.yml build

Then you can get own JavaScript files to correspond to each bundles. In abeve example, you can get ‘karmaid.js’ file.

If you want to generate one JS, run it:

webassets -c webassets.yml build <bundle name>

it’s over.

Why webassets

Because I wanted to try it. You know, you can choice fanstatic or grunt too.

And I want to use it with Pyramid and Python3, but now, pyramid_webassets on PyPI isn’t support Python3. This supporting will be finished soon (https://github.com/sontek/pyramid_webassets/issues/23).

Python mini Hack-a-thon 雪山合宿 2014 に行ってきた

Python mini Hack-a-thon 雪山合宿 2014 に行ってきた

Python mini Hack-a-thon 雪山合宿 2014

今回3回目の参加になる、Python mini hack-a-thonの合宿版です。 スキーはせずに引きこもって開発してました。

開発したもの:

genaa 0.4リリース

genaa というASCII Art生成ツールの最新版です。 日本語など、1文字で2幅以上持つ文字列に対応しました。 @nakamuray さんがフォークして開発しててくれたので取り込ませてもらいました。

invokeにプルリク

invoke はローカルでのコマンドをまとめるようなツールで、Pythonで書けるmakeみたいなものです。 実行できるタスクの一覧を ‘invoke –list’ で取れるんですが、 その際に各タスクの説明のサマリを表示するようにする対応をしていました。 まだ反応がないのでどうなるかわかんないですが。

遊んだテーブルゲーム

  • Love Letter: さっくり楽しめる&導入も簡単な割によくできてる印象。
  • 犯人は踊る: かなり面白かった。犯人は誰なのかと推理していく感じがよかった。
  • Dungean of Mandom: あんまり掴めなかった。

提供は @kiris さんより。

New year's python meme 2013

New year’s python meme 2013

Today is the final day of 2013, time to write New year’s python meme. This is the last year’s one:

1. What’s the coolest Python application, framework or library you have discovered in 2013 ?

Kaa is the coolest application. This is a CUI editor written in Python3.3. It is easy to use and useful, so I changed to use it on a routine basis. The development of kaa is very active, a new version is available almost everyday. Check out the version history.

I’m checking a Webframe work named morepath, too.

2. What new programming technique did you learn in 2013 ?

I learned how to distribute packages, creating libraries and Web frameworks. And learned the basics of Python, HTTP and WSGI. Last year, I didn’t know about them. just I created own Web applications using some frameworks. I aimed to learn them, written in 2012’s python meme. All of things I created and contributed are available on next section.

3. Which open source project did you contribute to the most in 2012 ? What did you do ?

May be Django. This year I joined one of django authors.

Or, Uiro framework.

And I created many libraries this year:

I also contributed existed projects:

4. Which Python blog or website did you read the most in 2013 ?

In Japanese:

5. What are the three top things you want to learn in 2014 ?

  1. English:

Next year, I will join to EuroPython2014. This will be the first time to join another country’s event. I will learn about English in order to enjoy this event much more. I listen to VOA Leaning English these days.

  1. How to keep developing and improving one project:

This year I created many packages, but almost of them are left alone. And I learned that the first release is not so important. To create effective and useful software, it is necessary to keep creating and improving.

  1. Not only Web. I’ve learned about Web programming for about 2 years:

This year, I will try to create something not relating Web. For the first step, now I’m creating genaa, a command line tool.

6. What is the top software, application or library you wish someone would write in 2014 ?

genaa is.

And some Web applications or libraries for Pyramid, not only Django.

I learned many things in 2013. I wish I would write more interesting things in 2014. Have a good holiday.

Pythonでバウンドインナークラスを使う (Python Advent Calendar 2013 最終日)

Pythonでバウンドインナークラスを使う (Python Advent Calendar 2013 最終日)

Python Advent Calendar 2013 25日目のブログ記事です。

Python Advent Calendarでは例年最終日にはゲストをお迎えして記事を書いてもらっています。今年は Python 3.4 のリリースマネージャーである Larry Hastings さんに書いていただきました。

Larry, thank you very much for your posting to this Python Advent Calendar!

ここでは日本語訳を書いていきたいと思います!

Pythonでバウンドインナークラスを使う

Python において、関数をクラス中に定義した際にはある魔法が起こります。 クラスのインスタンスを通して関数にアクセスした場合単なる関数が得られるわけではありません。 代わりに新しいオブジェクト「メソッド (method)」と呼ばれるものが返ります。 概念的にはこの関数はインスタンスに「バウンド/束縛 (bound)」されています。 実際にメソッドを呼んだ際にはそのインスタンスが関数の第一引数に自動的に 渡されます。別の位置引数 (potitional argument)は1つ後ろに追いやられます。

しかしこの魔法は関数にしか有効ではありません。クラスについて考えてみましょう。 Pythonでは、あるクラス C を別のクラス D 内に定義した際に、この C を 「インナークラス (inner class)」と呼びます (「ネステッドクラス (nested class)」かもしれません)。 D のインスタンスを通して C にアクセスした場合、 さきほどのような魔法はおこらず、単に C が返されます。 C を呼び出したとしても C.__init__ への引数は変わりません。

インナークラスが Python で使われることは稀です。なぜでしょうか。 それをする実用的な利点が無いからです。 Python のスコープルールによって面倒が生じます (後述)。

それでも私は Python でインナークラスをよく使います。 概念的に他のクラス内にあるべきクラスの場合です。 大抵の場合インナークラスはアウタークラスに “バウンド” されて欲しいものです。 しかしこのように、手動でする必要があります:

class D:
    class C:
        def __init__(self, outer):
            self.outer = outer
d = D()
c = d.C(outer)

関数がするように、インナークラスも “バウンド” されると良さそうです。 アウタークラスが自動的にインナークラスの __init__ に渡されると良さそうです。

でもこれって Python でできることなんでしょうか? 数年前、 Stack Overflow で聞いてみました:

http://stackoverflow.com/questions/2278426/inner-classes-how-can-i-get-the-outer-class-object-at-construction-time

返答には驚きました。それが不可能というだけでなく、意味がないと言うからです。 その後に Alex Martelli が、それは可能だと教えてくれました。 その解法には心底驚かされましたよ!彼の解法はクラスデコレーターを使って、 クラスを「ディスクリプター (descriptor)」にするというものでした。 これは関数がメソッドになるのと全く同じメカニズムです。実に素晴らしい!

Alexの許可を得て、私はこれを「レシピ」として、 Python Cookbookに投稿しました:

http://code.activestate.com/recipes/577070-bound-inner-classes/

このアプローチには何度も手直しをしました。今ではちゃんと動作しますよ! そして…そうなんです、このレシピは Python 2 と 3 両方で変更なしに動作します。

このバウンドインナークラス (bound inner class) のことは本当に気に入っていますし、 可能であればどこでも使います。バウンドインナークラスを人に教えたときの 一番よくあるフィードバックは 「それのユースケースは?」ですが、 私の回答はこうです「メソッド呼び出しのユースケースは?」 私が思うに、この2つは全く同じ質問です。そしてバウンドインナークラスは メソッドと同じくらい便利なものであるとオススメしておきます。 もしかしたらそれ以上かもしれません!

もちろん、クラスは関数よりも複雑なものです。つまりはバウンドインナークラスは メソッドよりも複雑です。例えば継承と2レベル以上のネストとなるとちょっと ややこしいことになります。 こんな場合でもバウンドインナークラスが実用的で、理解しやくなるよう 考えてみました。どう動作するかを少し理解して、いくつか単純なルールに従う 必要があります。これについては、上記の「レシピ」にすべて記載されています。

ぜひ皆さんのコードでもバウンドインナークラスを使ってみてください!

なぜインナークラスが不便になり得るかを疑問に思ってるかもしれませんね。 以下について考えてみてください:

class D:
    value = 5
    class C:
        value2 = value * 5

このコードは動作しません、 value について NameError を送出します。 C のコード中では value が見えないのです。 D のどのメンバーも見えません。 C が見えるすべてのメンバーはグローバルとビルドインです。 (残念ながら nonlocal キーワードもここでは助けになりません。 これはネストした関数でのみ有効で、クラス本体はネストした関数のようには 振る舞いません)

ここで、コードをこんな感じに変えてみましょう:

class D:
    value = 5
    class C:
        value2 = D.value * 5

悲しいことに、これもまた動作しません。 D はまだ存在しないからです。技術的には、 D は “まだバウンドされていません"。 このコードは D についての NameError を送出します。

唯一動作するのは、ルックアップをランタイムで行うことです:

class D:
    value = 5
    class C:
        def __init__(self):
            self.value2 = D.value * 5

言い換えると、コンパイルタイムにおいてネストしたクラスは アウタークラスのどのメンバーにもアクセスできないということです。

追伸、クリスマスを楽しむ日本の読者の皆様へ。 私が皆さんに教えてあげたいのは、実際にはアメリカ人は KFC をクリスマスに食べないということです!これは日本の KFC が創りだしたマーケティング上のギミックなのです。アメリカ人は家族でのディナーを盛大に行うものですが、伝統的なメインコースというものはありません。

以上です。

Larryさん、ありがとうございました!

(なおフッターにあるCC-BYの表記はこの記事においては有効ではありません。 The above expression about CC-BY is not available at this entry.)

Think about expression of blocks as 1 byte

Think about expression of blocks as 1 byte

This blog post for my unimportant memo.

I am creating genaa, a ASCII Art generator.

Now, It can rendering text box like this:

┌────────────────────┐
│Shut the f**k up and│
│write some code!    │
└────────────────────┘

And, I am considering about expression of blocks as 1 byte for providing new rendering feature for genaa.

Free blocks

The feature is rendering some blocks from sigunature. How can we express the following block as plain text?:

┌─┐

┌─┘ └─┐ └─────┘

(As you know, it’s the most gentle block on Tetris)

I noticed the block can be expressed by 6 characters:

69C
D47

Each characters mean the lines of the block. One character is actually hex, and each digits mean corresponding lines:

1

┌─┐

8 │ │ 2 : └─┘ : 4

And the sum of line numbers is the above character. For instance, 6 means ‘bottom’ and ‘right’:

│ 2

──┘ : 4

(Ofcause, this expression may contain some redundancies, like ‘28’)

This may be powerful and useful to render some blocks. But, the bad points is hard to read and write as plain text.

Using .raw method of Django's QuerySet

Using .raw method of Django’s QuerySet

Today, I show you to use .raw method of Django’s QuerySet. The method is powerful and it can manipurate data in DB even if a column is not appear in Model’s field.

Of cause you can choice to use executing raw query by db connection directory. But, using raw method of QuerySet is more comfy. The method allow you to map the values in DB to the objects manually.

Ok, now let me show you a example. Consider a model calss, named Post, like this:

class Post(models.Model):
    title = models.CharField(max_length=255)
    body = models.CharField(max_length=255)

The model is simple and common what in like everyday we write. And then, try to change the schema of it directory:

sqlite> ALTER TABLE demoapp_post ADD COLUMN "slug" varchar(255);
sqlite> .schema demoapp_post
CREATE TABLE "demoapp_post" (
    "id" integer NOT NULL PRIMARY KEY,
    "title" varchar(255) NOT NULL,
    "body" varchar(255) NOT NULL,
    "slug" varchar(255));

just now, I added a column named ‘slug’. The column and model fields have a difference now. This ‘slug’ appears in sqlite db column, but not in the model.

And try to insert a row:

sqlite> INSERT INTO demoapp_post ("title", "body", "slug") VALUES ("test", "test body", "test slug");
sqlite> SELECT * FROM demoapp_post;
1|test|test body|test slug

Then let’s consider how we can get the value of slug (‘test slug’).

Use .raw method

The easiest way is ‘adding a field to the model and migrating the existed DB’. Yes, I know. but, sometime we should get a value from DB even if the column is not in the model fields.

Then, you might want to use raw method?

We can write a SQL directory as a argument to raw method. and the return value of the SQL will be mapped to a Model called the raw method, like this:

>>> post = Post.objects.raw("SELECT * FROM demoapp_post")[0]
>>> post.title
u'test'
>>> post.body
u'test body'
>>> post.slug
u'test slug'
>>> post.nothing
Traceback (most recent call last):
 File "<console>", line 1, in <module>
AttributeError: 'Post' object has no attribute 'nothing'

Yeah! the value of ‘slug’ was showed up. In common way, we can’t get the vaule..:

>>> post = Post.objects.all()[0]
>>> post.title
u'test'
>>> post.body
u'test body'
>>> post.slug
Traceback (most recent call last):
 File "<console>", line 1, in <module>
AttributeError: 'Post' object has no attribute 'slug'

Mapping the attribute more flexible

And then, by specifying the ‘translations’ attribute, we can change the mapping from DB value to Model attribute.

Ok next, let’s try to get the value of ‘slug’ column, through ‘urlslug’ attribute of a model:

>>> post = Post.objects.raw("SELECT * FROM demoapp_post", translations={'slug': 'urlslug'})[0]
>>> post.slug
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'Post' object has no attribute 'slug'
>>> post.urlslug
u'test slug'

aw, it’s spookey, though.

(I checked above codes with Django 1.6)