概念的レベル
概要
Django は MVC に属する Web フレームワークです。
モデル: データベースの処理を担当します
ビュー: モデルから取得したデータの取得または拡張を担当します
コントローラー: これは Django 自体です
プロジェクトとアプリの違い
プロジェクト: さまざまな設定ファイルを提供します アプリ: モデルやビューを含む関数の組み合わせは、Python が認識できるように「__init__.py」をルート ディレクトリに追加する必要があります
ManyToMany とForeignKey の違い
外部キーの例:
従業員の出勤記録 - 従業員は複数の出勤記録を持つことができますが、1 つのパンチイン レコードは 1 つの従業員属性 (1 対多) のみを持つことができます
ManyToMany の例:
記事には複数のタグを付けることができ、タグに対応する記事も複数 (多対多) にすることができます
ManyToMany にも特別な構造があり、Twitter のフォローによく似ています。
A は B に従うが、B は A に従わないとします。この関係を実現するには、Meta
で symetric=False を設定します。セクシーコード
これが私が理解して「めちゃくちゃセクシー」だと思うコードです:
lambda x, y: x+y
Lambda は実際には JS の匿名関数と同じ効果があります。名前を付けるのが面倒であればそのまま放り込んでください。Lambda はデフォルトで内部の値を返すため、return する必要はありません。
map(lambda x: x+1, [1,2,3]) #得到[2,3,4]
つまり、前の関数はそれぞれ 1 回実行されます
reduce(lambda x, y: x+y, [1,2,3]) #得到6
つまり、各操作は前の要素で 1 回実行されます
[i for i in xrange(0,100) if i%2==0]
100 未満の偶数をすべて取得します。これは学術用語では「リスト理解」と呼ばれますが、実際のケースでは、トラバースのための優れたツールです。
Q(**{key:value})
トレーニング中に学んだことは、2 つの Django 関数 Q と F は文字列を受け入れない、つまり Q("abc=1") は受け入れられないということです。しかし、このコードの魅力的な点は、この制約が完全に取り除かれ (実際、キーワードのペアが書き換えられる)、好みのクエリ セグメントを自由に構築できることです。これは、検索関数を構築するときに非常に役立ちます。例:
q_dict = reduce(lambda x,y: x&y, [ Q(**{"%s__slug_name" % taxonomy:request.GET.get(taxonomy)} ) for taxonomy in request.GET.keys() if taxonomy in SEARCHABLE_LIST ]) @property
この @ 記号の使い方を「修飾子」と呼びますが、個人的にはここが他の言語に比べて Python の美しいところだと感じています。修飾子の作り方についてはドキュメントを読むのが良いでしょう。ここで私が言っているのは、クラスで @property を使用すると、この関数は自動的にクラスのプロパティになるということです。これは、js の set と get
に非常に似ています。
super super クラスを使用すると、super が出現すると、継承されたサブクラスは独自の関数を実行するのではなく、super
で指定された関数を実行します。
注釈を付けて集計します。これら 2 人は、新しい query_set を構築するときに非常に役立ちます。たとえば、コンピュータの合計価格を計算したい場合は、ComputerManager で
def get_query_set(self): query_set = super(ComputerManager, self).get_query_set() query_set = query_set.annotate(price=Sum('devices__price'))
このように、各コンピューターには合計価格が設定されています。これは製品セットを構築するときに非常に便利ですが、admin.py の記述は少し冗長です。
エラーセット
データをフェッチするとき: XXManager オブジェクトは反復可能ではありません
これは、Django がコードの実行中に SQL ステートメントを取得してクエリを実行しないためです (したがって、SQL ステートメントを取得することは不可能です)。したがって、実際のデータ エンティティを取得するには、.get()、.all()、.filter を使用する必要があります