パイソン - ジャンゴ - ORM F Qクエリとクエリ

models.py:

django.db輸入モデルから


#を押して
クラスの出版社(models.Model):
    ID = models.AutoField(PRIMARY_KEY =真)
    名前= models.CharField(max_lengthを= 64、ヌル= FALSE、TRUE =ユニーク)

    デフ__str __(自己):
        リターン "<出版物:{}>" 形式(self.name)


#ブックス
クラスブック(models.Model):
    ID = models.AutoField(PRIMARY_KEY =真)
    タイトル= models.CharField(max_lengthを= 64、ヌル= Falseの、ユニーク=真)
    5桁、小数点以下2桁、デフォルト値00.00に価格= models.DecimalField(max_digits = 5、decimal_places = 2、デフォルト= 00.00)#アップ
    出版社= models.ForeignKey(= "出版社" と、ヌル=真)をTrueに#空集合
    数sell_num = models.IntegerField(デフォルト= 0)#の書籍を販売
    在庫数inventory_num = models.IntegerField(デフォルト= 1000)#書籍

    デフ__str __(自己):
        リターン。 "<ブックオブジェクト:{}>" 形式(self.title)


#著者
クラスの著者(models.Model):
    ID = models.AutoField(PRIMARY_KEY =真)
    名前= models.CharField(max_lengthを= 16、ヌル= FALSE、TRUE =ユニーク)
    ブック= models.ManyToManyField#の-many関連帳テーブル(=「ブック」に)、ORMは自動的に3のテーブルを生成します。

    デフ__str __(自己):
        リターン "<著者オブジェクト:{}>" 形式(self.name)

ブックテーブル:

私の在庫と販売量を変更します

 

Fクエリ:

あなたが別のフィールドに2つのテーブルを比較したい場合は、クエリFを使用することができます

orm.py:

輸入OS

__name__ == '__main__' の場合:
    #ロード構成情報Djangoプロジェクト
    os.environ.setdefault( "DJANGO_SETTINGS_MODULE"、 "mysite2.settings")
    #輸入ジャンゴ、とDjangoのプロジェクトを開始
    輸入ジャンゴ
    django.setup()

    app01輸入モデルから

    django.db.modelsからFをインポート

    #(比較のための2つのフィールド)の量で書籍を販売するために在庫を大量にチェックしてください
    RET = models.Book.objects.filter(inventory_num__gt = F( "sell_num"))
    プリント(右)

結果:

 

オブジェクトおよびF()との間のF.()はまた、オブジェクトおよび定数とモジュロ演算との減算することができます。

orm.py:

輸入OS

__name__ == '__main__' の場合:
    #ロード構成情報Djangoプロジェクト
    os.environ.setdefault( "DJANGO_SETTINGS_MODULE"、 "mysite2.settings")
    #輸入ジャンゴ、とDjangoのプロジェクトを開始
    輸入ジャンゴ
    django.setup()

    django.db.modelsからFをインポート

    #販売量1を、そして3を取ります
    models.Book.objects.update(sell_num =(F( "sell_num")+ 1)* 3)

結果:

 

使用 F 查询修改 char 字段

orm.py:

import os

if __name__ == '__main__':
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    # 给每一本书的书名后面加上 “第一版”
    from django.db.models.functions import Concat
    from django.db.models import Value

    models.Book.objects.update(title=Concat(F("title"), Value("第一版")))

运行结果:

 具体的对象没有 update() 方法,需要使用 save() 方法,QuerySet 对象有 update() 方法

 

Q 查询:

如果需要执行 or 操作,可以使用 Q 查询

orm.py:

import os

if __name__ == '__main__':
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from django.db.models import Q
    
    # 查询卖出量大于 1000,且库存量小于 500 的书
    ret = models.Book.objects.filter(sell_num__gt=1000, inventory_num__lt=500)
    print(ret)
    
    # 查询卖出量大于 1500,或者库存量小于 200 的书
    ret = models.Book.objects.filter(Q(sell_num__gt=1500) | Q(inventory_num__lt=200))
    print(ret)

运行结果:

 

Q 查询和字段查询同时存在时, 字段查询要放在 Q 查询的后面
orm.py:

import os

if __name__ == '__main__':
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from django.db.models import Q
    
    # Q 查询和字段查询同时存在时, 字段查询要放在 Q 查询的后面
    # 查询卖出量大于 1500,或者库存量小于 200,且 title 包含 P 的书
    ret = models.Book.objects.filter(Q(sell_num__gt=1500) | Q(inventory_num__lt=200), title__contains="P")
    print(ret)

运行结果:

 

おすすめ

転載: www.cnblogs.com/sch01ar/p/11306019.html