目次
字段查询
__id
__exact
__iexact
__contains
__ icontains
__in
__gt 大于
__range
__year
__month
__day
__hour
__minute
__isnull
ホームページ データベース mysql チュートリアル Django中的模型与数据库(Models and database)

Django中的模型与数据库(Models and database)

Jun 07, 2016 pm 03:15 PM
and da django データベース モデル

Django中的模型与数据库(Models and database) 对于数据库大家都不陌生,但是Models该怎么理解,官方文档中有这么一句话: A model is the single, definitive source of data about your data. It contains the essential fields and behaviors of thedata yo

Django中的模型与数据库(Models and database)

对于数据库大家都不陌生,但是Models该怎么理解,官方文档中有这么一句话:
A model is the single, definitive source of data about your data. It contains the essential fields and behaviors of thedata you’re storing. Generally, each model maps to a single database table.

下文暂且称Models为“模型”(个人叫法)


那么,模型具备以下三个特征:

每一个模型都是一个python子类。继承django.db.models.Model模型的每一个属性代表一个数据库字段除了上述之外,jango还提供了自动生成数据库访问的API为了方便理解我们举个例子下面这个例子我们建立了一个Person的模型,且有两个字段)first_name,last_name

<code><span>from</span> django.db <span>import</span> models
<span><span>class</span> <span>Person</span><span>(models.Model)</span>:</span>
    first_name = models.CharField(max_length=<span>30</span>)
    last_name = models.CharField(max_length=<span>30</span>)

first_name和last_name是Person模型的Field,每一个Field都是一个指定的类的属性,每一个属性映射到数据库的没一列</code>
ログイン後にコピー

这里我就有一个疑问,到底Field能不能称为字段?


<code>上面的Person模型将会对应一张这样的数据库表:

CREATE TABLE myapp_person (
    <span>"id"</span> serial NOT NULL PRIMARY KEY,
    <span>"first_name"</span> varchar(<span>30</span>) NOT NULL,
    <span>"last_name"</span> varchar(<span>30</span>) NOT NULL
);

下面我们聊聊使用,一旦你声明了一个models,你需要去告诉jango你将会去使用该models,在你的settings里把你的

应用名加到INSTALLED_APPS中

INSTALLED_APPS = (
<span>#...</span>
’myapp’,
<span>#...</span>
)
当你在INSTALLED_APPS添加新应用后,需要执行manage.py migrate </code>
ログイン後にコピー

接下来我们再来说说Fields

<code>它是模型的重要的一部分,它定义了数据库表的字段

<span>from</span> django.db <span>import</span> models
<span><span>class</span> <span>Musician</span><span>(models.Model)</span>:</span>
    first_name = models.CharField(max_length=<span>50</span>)
    last_name = models.CharField(max_length=<span>50</span>)
    instrument = models.CharField(max_length=<span>100</span>)
    <span><span>class</span> <span>Album</span><span>(models.Model)</span>:</span>
    artist = models.ForeignKey(Musician)
    name = models.CharField(max_length=<span>100</span>)
    release_date = models.DateField()
    num_stars = models.IntegerField()

模型中每一个field是一个Field类实例,jango通过Field类类型去确定一下几个点。
<span>1.</span>数据库字段的类型
<span>2.</span>使用默认的HTML部件但渲染表单的field时(e.g. <input type="“text”">,<select>)</select></code>
ログイン後にコピー

Field option

<code>每一个Field都有一个特定参数,例如CharField,max_length
null  如果是真,jango将会存储空值null进数据库 默认为false
blank 如果为真,field将会允许空格的输入, 默认为false
choices 一个二位元组,如果field中使用choices 则在前端展示的HTML组件就是<select>
</select></code>
ログイン後にコピー

举个例子

<code>
YEAR_IN_SCHOOL_CHOICES = (
(’FR’, ’Freshman’),
(’SO’, ’Sophomore’),
(’JR’, ’Junior’),
(’SR’, ’Senior’),
(’GR’, ’Graduate’),
)

<span>from</span> django.db <span>import</span> models
<span><span>class</span> <span>Person</span><span>(models.Model)</span>:</span>
    SHIRT_SIZES = ( 
        (’S’, ’Small’),
        (’M’, ’Medium’),
        (’L’, ’Large’),
    )
    name = models.CharField(max_length=<span>60</span>)
    shirt_size = models.CharField(max_length=<span>1</span>,choices=SHIRT_SIZES)



<span>>>> </span>p = Person(name=<span>"Fred Flintstone"</span>, shirt_size=<span>"L"</span>)
<span>>>> </span>p.save()
<span>>>> </span>p.shirt_size
u’L’
<span>>>> </span>p.get_shirt_size_display()
u’Large’</code>
ログイン後にコピー

save()
这个在后台执行了一个插入sql。但是并没有真正的导数据库知道用户执行了save(),save()没有返回值,但是save()支持参数

<code>Model.save ([force_insert=<span>False</span>, force_update=<span>False</span>, using=DEFAULT_DB_ALIAS, update_fields=<span>None</span>
] )</code>
ログイン後にコピー

当你执行save()操作,jango执行以下步鄹

  • 1:触发pre-save事件,这个信号,任何一个函数都可以监听这个事件

  • 2:一些有特殊的字段类型的字段做处理,例如dateField和auto_now=True这时候得到的值是jango生成的时间,这里要注意的是,数据库的时间可能跟服务器的不一样,所以这里要注意时间同步。

  • 3:为插入准备数据,每一个字段提供一个处理后的值

  • 4:为插入准备sql,这里我理解为拼sql

  • 5:发给数据库执行sql

all()

<code>all_entries = Entry.objects.all() 查看所有的内容

filter(**kwargs)

我们现在看下通过过滤器(filters)获取具体的值

Entry.objects.filter(pub_date__year=<span>2006</span>)

exclude(**kwargs)

Entry.objects.filter(
<span>... </span>headline__startswith=’What’
<span>... </span>).exclude(
<span>... </span>pub_date__gte=datetime.date.today()
<span>... </span>).filter(
<span>... </span>pub_date__gte=datetime(<span>2005</span>, <span>1</span>, <span>30</span>)
… )

返回除去与查找条件相符的数据

get()

如果想要返回指定的一个数据

one_enty = Entry.objects.get(pk=<span>1</span>)
</code>
ログイン後にコピー

字段查询

__id

<code>被指定的查询字段名字必须是模型field名字相对应,除非外键的情况

Entry.objects.filter(blog_id=<span>4</span>)

这时候返回并不是Entry中id=<span>4</span>的数据行,而是id对应主键算在的数据行</code>
ログイン後にコピー

__exact

<code>最普通的情况(默认添加)

Entry.objects.get(headline__exact=<span>"Man bites dog"</span>)

翻译成sql就为

SELECT ... WHERE headline = ’Man bites dog’;


Blog.objects.get(id__exact=<span>14</span>) <span># 明确的形式</span>
Blog.objects.get(id=<span>14</span>) <span># __exact 默认添加</span></code>
ログイン後にコピー

__iexact

<code>Blog.objects.get(name__iexact=<span>"beatles blog"</span>)

结果可能是 <span>"Beatles Blog"</span>,  <span>"beatles blog"</span>, <span>or</span>   <span>"BeAtlES blOG"</span>.

不区分大小写</code>
ログイン後にコピー

__contains

<code>Entry.objects.get(headline__contains=’Lennon’)

模糊搜索,翻译成sql

SELECT ... WHERE headline LIKE ’%Lennon%’;</code>
ログイン後にコピー

__ icontains

<code>Entry.objects.get(headline__icontains=’Lennon’)

sql:

SELECT ... WHERE headline ILIKE ’%Lennon%’;</code>
ログイン後にコピー

__in

<code>Entry.objects.filter(id__in=[<span>1</span>,<span>3</span>,<span>4</span>]
sql:
SELECT … WHERE id IN (<span>1</span>,<span>3</span>,<span>4</span>);

这种也可以用复合sql的形式表示
 inner_qs = Blog.objects.filter(name__contains=’Cheddar’)

entries = Entry.objects.filter(blog__in=inner_qs)

sql:

SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE ’%Cheddar%’)</code>
ログイン後にコピー

__gt 大于

<code>Entry.objects.filter(id__gt=<span>4</span>)
sql:
SELECT … WHERE id > <span>4</span>
__gte 大于等于
__lt 小于
__lte 小于等于</code>
ログイン後にコピー

__range

<code><span>import</span> datetime
start_date = datetime.date(<span>2005</span>, <span>1</span>, <span>1</span>)
end_date = datetime.date(<span>2005</span>, <span>3</span>, <span>31</span>)
Entry.objects.filter(pub_date__range=(start_date, end_date))

sql:
SELECT ... WHERE pub_date BETWEEN ’<span>2005</span>-<span>01</span>-<span>01</span>’ <span>and</span> ’<span>2005</span>-<span>03</span>-<span>31</span>’;</code>
ログイン後にコピー

__year

<code>Entry.objects.filter(pub_date_year=<span>2005</span>)
sql:
SELECT … WHERE pub_date BETWEEN ‘<span>2005</span>-<span>01</span>-<span>01</span>’ <span>and</span> ‘<span>2005</span>-<span>12</span>-<span>31</span>’;</code>
ログイン後にコピー

__month

__day

__hour

__minute

<code>Entry.objects.filter(pub_date__month=<span>12</span>)
sql:

SELECT ... WHERE EXTRACT(’month’ FROM pub_date) = ’<span>12</span>’;</code>
ログイン後にコピー

__isnull

<code>Entry.objects.filter(pub_date__isnull=<span>True</span>)
sql:
SELECT ... WHERE pub_date IS NULL;</code>
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

OpenAI データは必要ありません。大規模なコード モデルのリストに加わりましょう。 UIUC が StarCoder-15B-Instruct をリリース OpenAI データは必要ありません。大規模なコード モデルのリストに加わりましょう。 UIUC が StarCoder-15B-Instruct をリリース Jun 13, 2024 pm 01:59 PM

ソフトウェア テクノロジの最前線に立つ UIUC Zhang Lingming のグループは、BigCode 組織の研究者とともに、最近 StarCoder2-15B-Instruct 大規模コード モデルを発表しました。この革新的な成果により、コード生成タスクにおいて大きな進歩が達成され、CodeLlama-70B-Instruct を上回り、コード生成パフォーマンス リストのトップに到達しました。 StarCoder2-15B-Instruct のユニークな特徴は、その純粋な自己調整戦略であり、トレーニング プロセス全体がオープンで透過的で、完全に自律的で制御可能です。このモデルは、高価な手動アノテーションに頼ることなく、StarCoder-15B 基本モデルの微調整に応じて、StarCoder2-15B を介して数千の命令を生成します。

iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます iOS 18では、紛失または破損した写真を復元するための新しい「復元」アルバム機能が追加されます Jul 18, 2024 am 05:48 AM

Apple の最新リリースの iOS18、iPadOS18、および macOS Sequoia システムでは、さまざまな理由で紛失または破損した写真やビデオをユーザーが簡単に回復できるように設計された重要な機能が写真アプリケーションに追加されました。この新機能では、写真アプリのツール セクションに「Recovered」というアルバムが導入され、ユーザーがデバイス上に写真ライブラリに含まれていない写真やビデオがある場合に自動的に表示されます。 「Recovered」アルバムの登場により、データベースの破損、カメラ アプリケーションが写真ライブラリに正しく保存されない、または写真ライブラリを管理するサードパーティ アプリケーションによって失われた写真やビデオに対する解決策が提供されます。ユーザーはいくつかの簡単な手順を実行するだけで済みます

Yolov10: 詳細な説明、展開、アプリケーションがすべて 1 か所にまとめられています。 Yolov10: 詳細な説明、展開、アプリケーションがすべて 1 か所にまとめられています。 Jun 07, 2024 pm 12:05 PM

1. はじめに ここ数年、YOLO は、計算コストと検出パフォーマンスの効果的なバランスにより、リアルタイム物体検出の分野で主流のパラダイムとなっています。研究者たちは、YOLO のアーキテクチャ設計、最適化目標、データ拡張戦略などを調査し、大きな進歩を遂げました。同時に、後処理に非最大抑制 (NMS) に依存すると、YOLO のエンドツーエンドの展開が妨げられ、推論レイテンシに悪影響を及ぼします。 YOLO では、さまざまなコンポーネントの設計に包括的かつ徹底的な検査が欠けており、その結果、大幅な計算冗長性が生じ、モデルの機能が制限されます。効率は最適ではありませんが、パフォーマンス向上の可能性は比較的大きくなります。この作業の目標は、後処理とモデル アーキテクチャの両方から YOLO のパフォーマンス効率の境界をさらに改善することです。この目的を達成するために

清華大学が引き継ぎ、YOLOv10 が登場しました。パフォーマンスが大幅に向上し、GitHub のホット リストに掲載されました。 清華大学が引き継ぎ、YOLOv10 が登場しました。パフォーマンスが大幅に向上し、GitHub のホット リストに掲載されました。 Jun 06, 2024 pm 12:20 PM

ターゲット検出システムのベンチマークである YOLO シリーズが再び大幅にアップグレードされました。今年 2 月の YOLOv9 のリリース以来、YOLO (YouOnlyLookOnce) シリーズのバトンは清華大学の研究者の手に渡されました。先週末、YOLOv10 のリリースのニュースが AI コミュニティの注目を集めました。これは、コンピュータ ビジョンの分野における画期的なフレームワークと考えられており、リアルタイムのエンドツーエンドの物体検出機能で知られており、効率と精度を組み合わせた強力なソリューションを提供することで YOLO シリーズの伝統を継承しています。論文アドレス: https://arxiv.org/pdf/2405.14458 プロジェクトアドレス: https://github.com/THU-MIG/yo

PHP でデータベース接続エラーを処理する方法 PHP でデータベース接続エラーを処理する方法 Jun 05, 2024 pm 02:16 PM

PHP でデータベース接続エラーを処理するには、次の手順を使用できます。 mysqli_connect_errno() を使用してエラー コードを取得します。 mysqli_connect_error() を使用してエラー メッセージを取得します。これらのエラー メッセージをキャプチャしてログに記録することで、データベース接続の問題を簡単に特定して解決でき、アプリケーションをスムーズに実行できるようになります。

PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル PHP で MySQLi を使用してデータベース接続を確立するための詳細なチュートリアル Jun 04, 2024 pm 01:42 PM

MySQLi を使用して PHP でデータベース接続を確立する方法: MySQLi 拡張機能を含める (require_once) 接続関数を作成する (functionconnect_to_db) 接続関数を呼び出す ($conn=connect_to_db()) クエリを実行する ($result=$conn->query()) 閉じる接続 ( $conn->close())

Google Gemini 1.5 テクニカル レポート: 数学オリンピックの問題を簡単に証明、Flash バージョンは GPT-4 Turbo より 5 倍高速 Google Gemini 1.5 テクニカル レポート: 数学オリンピックの問題を簡単に証明、Flash バージョンは GPT-4 Turbo より 5 倍高速 Jun 13, 2024 pm 01:52 PM

今年 2 月、Google はマルチモーダル大型モデル Gemini 1.5 を発表しました。これは、エンジニアリングとインフラストラクチャの最適化、MoE アーキテクチャ、その他の戦略を通じてパフォーマンスと速度を大幅に向上させました。より長いコンテキスト、より強力な推論機能、およびクロスモーダル コンテンツのより適切な処理が可能になります。今週金曜日、Google DeepMind は Gemini 1.5 の技術レポートを正式にリリースしました。このレポートには Flash バージョンとその他の最近のアップグレードが含まれています。このドキュメントは 153 ページあります。技術レポートのリンク: https://storage.googleapis.com/deepmind-media/gemini/gemini_v1_5_report.pdf このレポートでは、Google が Gemini1 を紹介しています。

データセットが異なればスケーリング則も異なりますか?圧縮アルゴリズムを使用してそれを予測できます データセットが異なればスケーリング則も異なりますか?圧縮アルゴリズムを使用してそれを予測できます Jun 07, 2024 pm 05:51 PM

一般に、ニューラル ネットワークのトレーニングに必要な計算が増えるほど、パフォーマンスが向上します。計算をスケールアップするときは、モデル パラメーターの数を増やすか、データ セットのサイズを増やすかを決定する必要があります。この 2 つの要素は、固定された計算予算内で比較検討する必要があります。モデル パラメーターの数を増やす利点は、モデルの複雑さと表現能力が向上し、それによってトレーニング データの適合性が向上することです。ただし、パラメーターが多すぎると過剰適合が発生し、目に見えないデータに対するモデルのパフォーマンスが低下する可能性があります。一方、データセットのサイズを拡張すると、モデルの汎化能力が向上し、過剰適合の問題が軽減されます。パラメーターとデータを適切に割り当てている限り、固定されたコンピューティング予算内でパフォーマンスを最大化できます。これまでの多くの研究では、神経言語モデルの Scalingl が検討されてきました。

See all articles