お気に入りのDjangoのヒントと機能は?


308

「...の隠された機能」の質問シリーズに触発されて、お気に入りのDjangoのヒント、またはあまり知られていないが知っている便利な機能について知りたいです。

  • 回答ごとに1つのヒントのみを含めてください。
  • Djangoのバージョン要件がある場合は追加します。

回答:


221

私は自分からのヒントから始めます:)

ハードコーディングされたディレクトリ名を回避するには、settings.pyでos.path.dirname()を使用します。

別の場所でプロジェクトを実行する場合は、settings.pyにパスをハードコードしないでください。テンプレートと静的ファイルがDjangoプロジェクトディレクトリ内にある場合は、settings.pyで次のコードを使用します。

# settings.py
import os
PROJECT_DIR = os.path.dirname(__file__)
...
STATIC_DOC_ROOT = os.path.join(PROJECT_DIR, "static")
...
TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, "templates"),
)

クレジット:このヒントは、スクリーンキャスト「Django From the Ground Up」から入手しました。


75
自分の質問に答える人に反対票を投じるべきではありません。事前に決定されていても、推奨されます。
Paolo Bergantino、

19
これはとても良いアイデアなので、なぜそれがデフォルトではないのか理解するのにまだ苦労しています。同じマシンで何人の人がテストしてデプロイしますか?
SingleNegationElimination 2009

19
これにより、常に煩わしく感じるos.path.join()を常に入力する必要がなくなりますj = lambda filename: os.path.join(PROJECT_DIR, filename)。次に、単に入力する必要がありますj("static")
wr。

13
Windowsを使用している場合は、バックスラッシュを置き換えます:os.path.join(PROJECT_DIR、 "templates")。replace( '\\'、 '/')
Peter Mortensen

7
Djangoでこれを修正したい場合は、code.djangoproject.com / ticket / 694にコメントを残して、コア開発者wontfix決定の再検討を依頼してください
ソリン2010

128

Django Command Extensionspygraphvizをインストールし、次のコマンドを発行して、見栄えの良いDjangoモデルの視覚化を取得します。

./manage.py graph_models -a -g -o my_project.png

pygraphvizをWindowsに正しくインストールできませんでしたが、graphvizを使用してドットファイルから変換できます。
monkut 2009

私はこれを間違いなく+1でモデル図を共有するのが大好きです
BozoJoe

このためのsvgオプションはありますか?
Keyo

出力画像は現在
無効に

119

の代わりにdjango-annoyingの render_toデコレータを使用してくださいrender_to_response

@render_to('template.html')
def foo(request):
    bars = Bar.objects.all()
    if request.user.is_authenticated():
        return HttpResponseRedirect("/some/url/")
    else:
        return {'bars': bars}

# equals to
def foo(request):
    bars = Bar.objects.all()
    if request.user.is_authenticated():
        return HttpResponseRedirect("/some/url/")
    else:
        return render_to_response('template.html',
                              {'bars': bars},
                              context_instance=RequestContext(request))

HttpResponse(リダイレクトなど)を返すとデコレーターが短絡し、期待どおりに機能することを指摘するように編集しました。


4
@becomingGuru-自動的に行われます。
ドミニクロジャー

15
HttpResponseRedirect()とrender_to_response()を返す場合を除いて、これは問題ありません。その後、リダイレクトは失敗します。
Matthew Schinckel、2009

17
嫌いです。「明示的は暗黙的よりも優れています」。デコレータは、render_toを正確にいつ行うかを通知していません。
タマシュSzelei

2
@Matthew Schinckelは実際にはリダイレクトをめちゃくちゃにしません-HttpResponseオブジェクトを返す場合、変更せずにそのまま渡します
Jiaaro

20
このアプローチはDjango 1.3の時点で冗長になっていると思います。django.shortcuts.render()を参照してください。docs.djangoproject.com/ en/dev/topics/http/shortcuts/#render
Dolph

101

サイトのテンプレート全体で使用する一連のカスタムタグがあります。それをオートロードする方法を探していましたが(DRY、覚えていますか?)、次のことがわかりました

from django import template
template.add_to_builtins('project.app.templatetags.custom_tag_module')

これをデフォルトでロードされるモジュール(たとえば、メインのurlconf)に配置すると、カスタムタグモジュールのタグとフィルターを、を使用せずに、どのテンプレートでも使用できるようになります{% load custom_tag_module %}

に渡される引数は、template.add_to_builtins()任意のモジュールパスにすることができます。カスタムタグモジュールは、特定のアプリケーションに存在する必要はありません。たとえば、プロジェクトのルートディレクトリ(例:)のモジュールにすることもできます'project.custom_tag_module'


@スティーフ、あなたは私にたくさんの時間/心痛/バイトを救ってくれた、ありがとう。
オロクサキ2010

すごくいい。ありがとう。また、カスタムタグのリポジトリは、ものを共有するのに最適だと思いませんか?
Leandro Ardissone 2010年

他の誰かがあなたのコードを保守する必要があるまで、それは素晴らしいことです。考えてみよう:「魔法の最小原理」
リッチ

96

Virtualenv + Python =複数のDjangoプロジェクトで作業していて、それらすべてが同じバージョンのDjango / anアプリケーションに依存していない可能性がある場合のライフセーバー。


15
これはロールする唯一の方法です!
未来主義者、2009

3
djangoでvirtualenvのチュートリアルリンクをいくつか追加していただけませんか?
BozoJoe

2
@BozoJoe:ターミナルで次のようにしてください:virtualenv myNewEnv --no-site-packages; . myNewEnv/bin/activate; pip install django; そしてそれはうまくいきます!
SingleNegationElimination 2011年

87

URLをハードコーディングしないでください。

代わりにURL名を使用し、reverse関数を使用してURL自体を取得します。

URLマッピングを定義するときに、URLに名前を付けます。

urlpatterns += ('project.application.views'
   url( r'^something/$', 'view_function', name="url-name" ),
   ....
)

名前がURLごとに一意であることを確認してください。

私は通常、一貫した形式の「project-appplication-view」を持っています。たとえば、スレッドビューの場合は「cbx-forum-thread」です。

更新ayazの追加を恥知らずに盗む):

この名前は、urlタグが付いたテンプレートで使用できます。


1
これについては100%同意します。私はハードコードされたURLを使い始めましたが、いくつかの変更に対応するためにURL形式を少し変更したとき、プロジェクトで私を悩ませました。時間をかけて戻ってすべてを調べ、ハードコードされたURLを置き換えました。私の唯一の大きな不満は、URLタグのエラーによりページ全体が強制終了されるのに対し、ハードコードされているのは個々のリンクのみを台無しにすることです。
ricree

21
これは隠れた機能であってはなりません。これがベストプラクティスであり、飛行する唯一の方法です。
Skylar Saveland 2009年

1
@skyl「飛ぶ唯一の方法」ではありません。私はDjango dev sprintにいて、Adrian Holovaty(Djangoの作成者の1人)はurlタグも使用しないと言っていました...彼のスタンスは、URLはとにかく変更されるべきではないということです(あなたがユーザー)。
TM。


jinja2を使用する場合は、次のreverseように追加するだけenvironment.filters['url'] = django.core.urlresolvers.reverseで、テンプレートで使用できます{{ 'view-name'|url(arg1, arg2)|e }}(HTMLに含めるために一部の文字をエスケープするには、「e」が必要です)
SingleNegationElimination


79

独自のログインページを作成しないでください。django.contrib.authを使用している場合。

実際の汚い秘密は、django.contrib.adminも使用していて、django.template.loaders.app_directories.load_template_sourceがテンプレートローダーにある 場合、テンプレートを無料で入手できることです!

# somewhere in urls.py
urlpatterns += patterns('django.contrib.auth',
    (r'^accounts/login/$','views.login', {'template_name': 'admin/login.html'}),
    (r'^accounts/logout/$','views.logout'),
)

1
涼しい!管理者のログインページを再利用できることを知りませんでした。ありがとう!
ジョシュアパルトギ2009

66

コンテキストプロセッサは素晴らしいです。

異なるユーザーモデルがあり、それをすべての応答に含めたいとします。これを行う代わりに:

def myview(request, arg, arg2=None, template='my/template.html'):
    ''' My view... '''
    response = dict()
    myuser = MyUser.objects.get(user=request.user)
    response['my_user'] = myuser
    ...
    return render_to_response(template,
                              response,
                              context_instance=RequestContext(request))

コンテキストプロセスでは、変数をテンプレートに渡すことができます。私は通常私に入れ'my_project/apps/core/context.pyます:

def my_context(request):
    try:
        return dict(my_user=MyUser.objects.get(user=request.user))
    except ObjectNotFound:
        return dict(my_user='')

あなたにあなたsettings.pyに次の行を追加してくださいTEMPLATE_CONTEXT_PROCESSORS

TEMPLATE_CONTEXT_PROCESSORS = (
    'my_project.apps.core.context.my_context',
    ...
)

これで、リクエストが行われるたびに、my_userキーが自動的に含まれます。

また、信号が勝ちます。

数か月前にこれについてブログ投稿を書いたので、カットアンドペーストするだけです。

箱から出してすぐに、Djangoは非常に役立ついくつかのシグナルを提供します。保存前、保存後、初期化、削除のほか、リクエストが処理されているときにも行うことができます。それでは、概念から離れて、これらがどのように使用されるかを示しましょう。ブログがあるとしましょう

from django.utils.translation import ugettext_lazy as _
class Post(models.Model):
    title = models.CharField(_('title'), max_length=255)
    body = models.TextField(_('body'))
    created = models.DateTimeField(auto_now_add=True)

したがって、どういうわけか、新しい投稿を作成した多くのブログpingサービスの1つに通知し、最新の投稿キャッシュを再構築して、それについてツイートする必要があります。シグナルがあれば、Postクラスにメソッドを追加しなくても、これらすべてを実行できます。

import twitter

from django.core.cache import cache
from django.db.models.signals import post_save
from django.conf import settings

def posted_blog(sender, created=None, instance=None, **kwargs):
    ''' Listens for a blog post to save and alerts some services. '''
    if (created and instance is not None):
        tweet = 'New blog post! %s' instance.title
        t = twitter.PostUpdate(settings.TWITTER_USER,
                               settings.TWITTER_PASSWD,
                               tweet)
        cache.set(instance.cache_key, instance, 60*5)
       # send pingbacks
       # ...
       # whatever else
    else:
        cache.delete(instance.cache_key)
post_save.connect(posted_blog, sender=Post)

それでは、その関数を定義し、post_init信号を使用して関数をPostモデルに接続し、保存後に実行します。


4
Djangoのシグナルは、Webフレームワークを比較するときに、私にとって必須の機能です。たとえば、「署名」モジュールからの更新をリッスンできるが、実際にはそのモジュールが機能する必要はなく、同じ機能を実装する互換性のあるモジュールでも機能する、疎結合のフォーラムを書くことは素晴らしいです。信号がよく知られていて人気がない理由はわかりません。
リーB

プロジェクトで再利用可能なアプリをいくつか使用する場合、信号は一般的に密結合とコードの混乱を避けるために非常に重要です。あなたはdjangoアプリの疎結合の優れた例を提供しました。これは+1です。
Lukasz Korzybski

信号が非同期かどうか知っていますか?
Kedare

「別のユーザーモデルがあり、それをすべての応答に含めたいとします。」-ユーザーをセッションに入れます。これにより、すべてのリクエストでデータベースヒットを節約できます。
jammon

シグナルの呼び出しは同期しています。私の意見では、ある種の非同期ジョブメカニズムは、たとえばTwitter / Facebook / etc(つまり、rabbitmq)での公開に適しているため、Webサイトのユーザーは要求に応じません。
gorsky


46

IPythonを使用して、任意のレベルでコードにジャンプし、IPythonの機能を使用してデバッグします。IPythonをインストールしたら、このコードをデバッグしたい場所に配置します。

from IPython.Shell import IPShellEmbed; IPShellEmbed()()

次に、ページを更新し、runserverウィンドウに移動すると、インタラクティブなIPythonウィンドウが表示されます。

TextMateでスニペットを設定したので、ipshellと入力してタブを押します。それなしでは生きられなかった。


22
インストールipdbしてから入力するだけipdb.set_trace()
TomaszZielińskiSep

または、Eclipse / PyDevのデバッガーを使用します。:-)
jMyles

3
ipdbをインポートします。ipdb.set_trace()FTW!
Hassek 2011

43

送信されたものを出力するだけの開発SMTPサーバーを実行します(実際に開発サーバーにSMTPをインストールしたくない場合)。

コマンドライン:

python -m smtpd -n -c DebuggingServer localhost:1025

12
同じ目的でdjango 1.2でコンソールとファイルのメールバックエンドを使用できます
Dmitry Shevchenko

未解決の!登録に最適!+1
BozoJoe

3
Django 1.2の代替設定:EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' ..メールをmanage.py出力に出力します。
vdboor 2011

41

ジャンゴ管理者のドキュメント

Bashシェルを使用する場合extras/django_bash_completionは、Djangoディストリビューションに含まれているDjango bash完了スクリプトのインストールを検討してください。django-admin.pymanage.pyコマンドのタブ補完が可能になるので、たとえば...

  • と入力しdjango-admin.pyます。
  • [TAB]を押すと、使用可能なすべてのオプションが表示されます。
  • と入力してsqlから[TAB]と入力すると、名前がで始まるすべての使用可能なオプションが表示されますsql

1
これは思ったより便利です。ありがとう!
Jeeyoung Kim

これは、少なくとも新しいUbuntuではデフォルトで含まれています。:-)それがどこからともなく出てきたとき、私は驚きました。
odinho-ベルモント11年

40

./manage.py runserver_plus付属していますfacilty django_extensionsは本当に素晴らしいです。

それは、とりわけ、Werkzeugデバッガーを使用してスタック内の各ポイントのインタラクティブなデバッグコンソールを作成する拡張デバッグページを作成します(スクリーンショットを参照)。またdump()、オブジェクト/フレームに関する情報を表示するための非常に便利なデバッグ方法も提供します。

ここに画像の説明を入力してください

インストールするには、pipを使用できます。

pip install django_extensions
pip install Werkzeug

その後、追加'django_extensions'あなたのINSTALLED_APPS中にタプルsettings.pyと新しい拡張子を持つ開発サーバーを起動します。

./manage.py runserver_plus

これにより、デバッグ方法が変わります。


37

私はPythonデバッガーpdbを使用してDjangoプロジェクトをデバッグするのが好きです。

これは、それを使用する方法を学ぶのに役立つリンクです:http : //www.ferg.org/papers/debugging_in_python.html


13
これは天の恵みです。もう少し情報を提供するには、コードの任意の行に「import pdb; pdb.set_trace()」を追加します。ページを更新します。ハングアップします。次に、開発サーバーを実行しているターミナルウィンドウに移動します。これで、デバッグコードを貼り付けたコードのその時点ですべての変数にアクセスできるインタラクティブシェルになるはずです。
priestc 2009


36

Dingoと一緒にJinja2を使用します。

Djangoテンプレート言語が非常に制限されている(私のように!)とわかった場合、その言語にこだわる必要はありません。Djangoは柔軟性が高く、テンプレート言語はシステムの他の部分と疎結合されているため、別のテンプレート言語をプラグインし、それを使用してhttp応答をレンダリングするだけです!

私はJinja2を使用しています。これは、djangoテンプレート言語のパワーアップバージョンとほとんど同じです。同じ構文を使用し、ifステートメントで式を使用できます。if_item_in_list!などのカスタムifタグを作成する必要はありません。あなたは単に%{ if item in list %}、または言うことができます{% if object.field < 10 %}

しかし、それだけではありません。テンプレートの作成を容易にするための機能が他にもたくさんあるので、ここではすべてを説明することはできません。


私はJinja2も使用して楽しんでいますが、「contrib」アプリケーションにはいくつかの結合があることがわかりました。特に、管理ツールはDjangoテンプレートとかなり密接に結びついています。また、Jinja2フレンドリーにするためにcontrib.authでログインデコレータを再作成する必要がありましたが、それほど難しくありませんでした。
Joe Holloway、

24
テンプレートシステムをjinja2で置き換えないでください。単に「追加」して、djangoテンプレートを削除しないでください。独自のビューにJinja2を使用し、管理インターフェースが引き続きdjangoテンプレート言語を使用できるようにします。
Hasen

4
私はこれにひどく同意します。ほとんどの場合、Djangoの制限された構文は許容されますが、カスタムタグを作成するポイントに到達し、それが実際にどれほど難しいかを知ると、
Jinja2

あなたがしたい場合にも、任意のテンプレートソースのメタプログラミングを使用すると、直接解析されたテンプレートのASTにアクセスすることができるので、Jinja2のは、はるかに楽しいです。ASTを歩くと、どのテンプレートが基本テンプレートを拡張するかを調べたり、バインドされていない変数をテンプレートソースブロックにリストしたりする作業がほとんど簡単になります。
rcoder、2009年

5
ありがたいことに、Django 1.2では、IFタグが
かなり

35

assert Falseビューコードにデバッグ情報をダンプするために追加します。


4
Falseの方が直感的であると主張する= D
ジャアロ2009

13
django開発サーバーでプロジェクトを実行している場合は、pythonのpdbモジュールを使用してください。これは、デバッグを行うためのより強力な方法です。pdbをインポートします。pdb.stack_trace()
mazelife 2009年

pdbは非常に便利です。デバッグが非常に高速でない限り、接続がタイムアウトする可能性があります。
スティーブンポールガー、2009

4
私はいつも5 / 0自分を使います。なぜ5つ?わからない
JasonSmith、2009

@StephenPaulger本当に?私のブラウザー(firefox / w firebug)は、デバッグしている間、コンテンツが応答を数分間待つようです。
TM。

34

これにより、Django URL名とリバースURLディスパッチに関する上記の返信に追加されます

URL名はテンプレート内でも効果的に使用できます。たとえば、特定のURLパターンの場合:

url(r'(?P<project_id>\d+)/team/$', 'project_team', name='project_team')

テンプレートには次のものを含めることができます。

<a href="{% url project_team project.id %}">Team</a>

27

Djangoの「ビュー」はHttpResponseを返す呼び出し可能オブジェクトである必要があるだけなので、Ruby on Railsやその他のフレームワークのようなクラスベースのビューを簡単に作成できます。

クラスベースのビューを作成するにはいくつかの方法がありますが、これが私のお気に入りです。

from django import http

class RestView(object):
    methods = ('GET', 'HEAD')

    @classmethod
    def dispatch(cls, request, *args, **kwargs):
        resource = cls()
        if request.method.lower() not in (method.lower() for method in resource.methods):
            return http.HttpResponseNotAllowed(resource.methods)
        try:
            method = getattr(resource, request.method.lower())
        except AttributeError:
            raise Exception("View method `%s` does not exist." % request.method.lower())
        if not callable(method):
            raise Exception("View method `%s` is not callable." % request.method.lower())
        return method(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
        return http.HttpResponse()

    def head(self, request, *args, **kwargs):
        response = self.get(request, *args, **kwargs)
        response.content = ''
        return response

条件付きリクエストの処理や承認など、他のあらゆる種類のものをベースビューに追加できます。

ビューを設定すると、urls.pyは次のようになります。

from django.conf.urls.defaults import *
from views import MyRestView

urlpatterns = patterns('',
    (r'^restview/', MyRestView.dispatch),
)

2
FWIWは、Djangoの作者は、実際にいくつかの場所では、クラスベースのビューを使用して、例えばcontrib.formtools:code.djangoproject.com/browser/django/trunk/django/contrib/...
mazelife

3
callメソッドを追加すると、RestfulResourceというクラスを作成して、urls.pyがインスタンスを指すようにすることができます。
Stephen Paulger、2009

1
新しい(Django 1.3?)汎用ビューはクラスベースです。
gorsky

21

を使用render_to_responseしてコンテキストをテンプレートにバインドしてレンダリングする代わりに(Djangoのドキュメントで通常表示される)、汎用ビューを使用しますdirect_to_template。これは同じことをrender_to_response行いますが、自動的にRequestContextをテンプレートコンテキストに追加し、暗黙的にコンテキストプロセッサを使用できるようにします。これはを使用して手動で実行できますrender_to_responseが、なぜわざわざ行うのですか?これは、覚えておくべきもう1つのステップであり、LOCです。コンテキストプロセッサを利用する以外に、テンプレートにRequestContextを含めると、次のようなことが可能になります。

<a href="{{MEDIA_URL}}images/frog.jpg">A frog</a> 

これは非常に便利です。実際、一般的なビューでは一般的に+1です。Djangoのドキュメントでは、ほとんどの場合、簡単なアプリ用のviews.pyファイルがない場合のショートカットとしても表示されますが、独自のビュー関数内で使用することもできます。

from django.views.generic import simple

def article_detail(request, slug=None):
    article = get_object_or_404(Article, slug=slug)
    return simple.direct_to_template(request, 
        template="articles/article_detail.html",
        extra_context={'article': article}
    )

django-annoyingで利用可能な@render_toデコレータを使用して、LOCをさらに節約します。bitbucket.org/offline/django-annoying
ピスティレス

6
..or新しい使用render1.3(ジャンゴからショートカット方法をdocs.djangoproject.com/en/dev/topics/http/shortcuts/#render
gorsky

20

問題のコメントに返信するのに十分な評判はありませんが、Jinjaを使用する場合、Djangoはテンプレートブロック名の「-」文字をサポートしないことに注意してください。これにより多くの問題が発生し、生成された非常にあいまいなエラーメッセージを追跡するために時間を無駄にしました。


「jinjaからのあいまいなエラーメッセージ」に該当する場合と該当しない場合がある1つの注意事項。settings.pyで必ずTEMPLATE_DEBUG = Falseを設定してください。何らかの理由で、これによりJinjaテンプレートから意味のあるエラーが発生します。
カールG

19

ウェブデザインのアプリは、あなたのウェブサイトを設計し始めたときに非常に便利です。インポートしたら、これを追加してサンプルテキストを生成できます。

{% load webdesign %}
{% lorem 5 p %}

4
FYI、代わりにDjangoのテンプレートのJinja2のを使用して、誰のために、あなたが行うことができます:{{lipsum(5)}}
ジョー・ホロウェイ


19

「manage.py runserver」で実行できる開発サーバーがあることは誰もが知っていますが、静的ファイル(CSS / JS / IMG)を提供するための開発ビューもあることを知っていますか?

Djangoには静的ファイルを提供する方法がまったくないため、新参者は常に困惑しています。これは、開発チームが実際のWebサーバーの仕事だと考えているためです。

しかし、開発時には、Apache + mod_wisgiを設定したくない場合があります。次に、以下をurls.pyに追加するだけです。

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': '/path/to/media'}),

CSS / JS / IMGはwww.yoursite.com/site_media/で入手できます。

もちろん、本番環境では使用しないでください。


6
私はこれを開発モードで使用し、本番環境でこれをオフにすることを忘れないようにするために、そのURLルールをDEBUGのみの条件付きでラップします。
sghael 2010年

18

これはsorl-thumbnailsアプリのドキュメントから学びました。テンプレートタグで「as」キーワードを使用して、呼び出しの結果をテンプレートの他の場所で使用できます。

例えば:

{% url image-processor uid as img_src %}
<img src="{% thumbnail img_src 100x100 %}"/>

これは、Djangoテンプレートタグのドキュメントで渡されるときに言及されていますが、ループにのみ言及しています。他の場所(どこでも?)でもこれを使用できることを彼らは呼びかけていません。


7
"as"のようなキーワードがテンプレートタグで使用できるかどうかは、この特定のタグに依存します。django自体ではなく、その意味に応じて単一のタグで定義されます。使用されている「として、」どのように参照するには上記URLタグで見て:code.djangoproject.com/browser/django/trunk/django/template/...
vikingosegundo

16

django.views.generic.list_detail.object_list-ページネーション用のすべてのロジックとテンプレート変数を提供します(私が何千回も書いたものの1つです)。 それをラップすると、必要なロジックが可能になります。このgemにより、「検索結果」ページでの1つ前のエラーのデバッグに何時間も節約でき、ビューコードがその過程できれいになります。


1
djangobook.com/en/2.0/chapter11で、本の新しいバージョンのGeneric Viewsに関する章を見つけることができます。コメントの1つは本のDjango pre-1.0バージョン(Django book 1.0)に
行きます

16

PyCharm IDEは、Djangoのサポートが組み込まれているため、コーディング、特にデバッグに適した環境です。


14

使用はxml_models(代わりに、SQLの1の)XML REST APIのバックエンドを使用Djangoのモデルを作成します。これは、サードパーティのAPIをモデリングする場合に特に便利です。これまでと同じクエリセット構文をすべて使用できます。PyPIからインストールできます。

APIからのXML:

<profile id=4>
    <email>joe@example.com</email>
    <first_name>Joe</first_name>
    <last_name>Example</last_name>
    <date_of_birth>1975-05-15</date_of_birth>
</profile>

そして今Pythonで:

class Profile(xml_models.Model):
    user_id = xml_models.IntField(xpath='/profile/@id')
    email = xml_models.CharField(xpath='/profile/email')
    first = xml_models.CharField(xpath='/profile/first_name')
    last = xml_models.CharField(xpath='/profile/last_name')
    birthday = xml_models.DateField(xpath='/profile/date_of_birth')

    finders = {
        (user_id,):  settings.API_URL +'/api/v1/profile/userid/%s',
        (email,):  settings.API_URL +'/api/v1/profile/email/%s',
    }

profile = Profile.objects.get(user_id=4)
print profile.email
# would print 'joe@example.com'

リレーションシップとコレクションも処理できます。頻繁に使用される製品コードで毎日使用しているため、ベータ版ですが非常に使用可能です。また、テストで使用できる適切なスタブのセットもあります。

(免責事項:私はこのライブラリの作成者ではありませんが、私はコミッターになり、いくつかのマイナーなコミットを行いました)


興味深いプロジェクト、続けてください!
Sergey Golovchenko 2010

ありがとう、かなり便利です:-)
godswearhats

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.