DjangoのORM-データベース操作とマルチテーブルクエリ

クラスやデータテーブルマップに私たちを助けてORMフレームワークでは、それは、クラスとオブジェクトを介して動作することができるようになりますテーブル内のデータを対応することを可能にします。

中に埋め込まれたDjangoのORMフレームワークは、データテーブルクラスとオブジェクトモデルチェンジ検索操作によって追加および削除が完了し、直接指向データベースプログラミングである必要はなく、クラス定義モデル。

データテーブルオブジェクトを作成します。
  • 2冊のモデルクラスの作成
    書籍やクラスヒーロークラスを、この本はヒーロー以上のものを持っています。
from django.db import models

#定义图书模型类BookInfo
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20, verbose_name='名称')
    bpub_date = models.DateField(verbose_name='发布日期')
    bread = models.IntegerField(default=0, verbose_name='阅读量')
    bcomment = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_books'  # 指明数据库表名
        verbose_name = '图书'  # 在admin站点中显示的名称
        verbose_name_plural = verbose_name  # 显示的复数名称

    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.btitle

#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
    GENDER_CHOICES = (
        (0, 'female'),
        (1, 'male')
    )
    hname = models.CharField(max_length=20, verbose_name='名称') 
    hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')  
    hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息') 
    hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_heros'
        verbose_name = '英雄'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.hname
  • 自動インクリメントの主キーidを自動的に作成別個のセットなし。
  • ForeignKey外部キーは、多くの関係よりは、その当事者に属している英雄のカテゴリに設定されています。
  • ForeignKeyバインドされているフィールドが指定されていない場合は、デフォルトでは、主キーIDを結合します。
追加、削除、変更、
  • 增:作成、保存
  1. モデル・クラス・オブジェクトを作成することによって、直接法の保存、データベースに()を保存行います。
>>> from datetime import date
>>> book = BookInfo(
    btitle='西游记',
    bput_date=date(1988,1,1),
    bread=10,
    bcomment=10
)
>>> book.save()
  1. モデルクラスの.objects.createで保存します()。
>>> HeroInfo.objects.create(
    hname='沙悟净',
    hgender=0,
    hbook=book
)
<HeroInfo: 沙悟净>
  • 删:delete
  1. オブジェクト.delete取得します()
hero = HeroInfo.objects.get(id=13)
hero.delete()
  1. オブジェクトを使用して得られた.Deleteフィルタ()
HeroInfo.objects.filter(id=14).delete()
  • 改:保存、更新
  1. そして、再割り当てモデルのクラスオブジェクトのプロパティを保存
hero = HeroInfo.objects.get(hname='猪八戒')
hero.hname = '猪悟能'
hero.save()
  1. オブジェクトのプロパティ・モデル・クラスを更新し、影響を受けた行の数を返します
HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')
  • 検索
    クエリは、それがマルチテーブルクエリに来る場合は特に、ほとんどの場合、比較的より複雑の使用が使用されている外部キーを持っています。
    1.単一のテーブル基礎となる問合せ:取得するには、すべての

    • GET
      データにノーネクタイで例外がスローされない場合、クエリをGET。
    >>> book = BookInfo.objects.get(btitle='西游记')
    >>> book.id
    
    • すべて
      すべての結果オブジェクトを返します
      >>> BookInfo.objects.all()
    
    • 最初の
      認定最初の結果オブジェクトを返します。

    2.フィルタのクエリの
    リストには、フィルタを使用します。

    • それに等しい:正確(省略可能)
    BookInfo.objects.filter(id__exact=1)
    # 可简写为:
    BookInfo.objects.filter(id=1)
    
    • 含まれています含まれている
      クエリのタイトルは、「パス」の本が含まれています。
    BookInfo.objects.filter(btitle__contains='传')
    
    • 空のクエリ:ISNULL
      クエリタイトルは本の空ではありません。
    BookInfo.objects.filter(btitle__isnull=False)
    
    • クエリの比較:
      文法が似ている、もはや表示されません
      • よりGT大きいです
      • 以上GTE
      • LTは未満であります
      • 以下、LTE

    残りのいくつかのフィルタクエリ照会も記録し、非常に簡単ではありません。

3.関数重合
含む集約関数:平均の平均を、数、最大値MAX、MIN最小和加算カウント、django.db.modelsに定義されています。

カウント冊の合計数を照会:

BookInfo.objects.count()

ORDER_BYの並び替え:

BookInfo.objects.all().order_by('bread')  # 升序
BookInfo.objects.all().order_by('-bread')  # 降序
4.関連クエリ

最も重要で最も紛らわしい部分がクエリに関連付けられています。

  • いくつかの一つは、(外部キーがrelated_name属性かどうかに注意してください)
    (表は外部キーを含むテーブルクエリへの外部キーが含まれていません)
    一对应的模型类对象.多对应的模型类名小写_set
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()

外部キーが定義されている場合はralated_name、属性、
こうした外部キーは、次のように定義されている場合のように:

hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书', ralated_name = "book")  # 外键

今までのマルチ問合せ文:

b = BookInfo.objects.get(id=1)
b.book.all()

定義された使用ralated_name名置換を模型类名小写_set、そのような文言は、シンプルでより便利にする必要があります。

  • 1に多くの
    (外部キーマッピングへの外部キーテーブルを含むテーブルからクエリ)
    多对应的模型类对象.多对应的模型类中的关系类属性名
h = HeroInfo.objects.get(id=1)
h.hbook
  • :対応するオブジェクトIDに関連付けられたモデルクラスへのアクセス
    (外部キーID属性マッピングに外部キーテーブルを含むテーブルからクエリ)
    多对应的模型类对象.关联类属性_id
h = HeroInfo.objects.get(id=1)
h.hbook_id

関連するフィルタクエリ

照会方法:关联模型类名小写__属性名__条件运算符=值

例:

# 查询图书,要求图书英雄为"孙悟空"
BookInfo.objects.filter(heroinfo__hname='孙悟空')
# 查询图书,要求图书中英雄的描述包含"八"
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
# 查询英雄, 要求所属书名为"天龙八部"
HeroInfo.objects.filter(hbook__btitle='天龙八部')
# 查询英雄,要求所属图书阅读量大于30
HeroInfo.objects.filter(hbook__bread__gt=30)

使用は、それが、小文字クエリに二重下線によって接続されたフィルタ条件を示すために、その関連テーブルEDITORIAL次いで、最終的にクエリが何であるかを、理解されています。

おすすめ

転載: blog.csdn.net/weixin_34204057/article/details/90786462