Django ORM QuerySet

Model

class Goods(models.Model):
    name = models.CharField(max_length=20, unique=True,
                            validators=[RegexValidator(regex=r'^[\w]+$', message="商品名称必须为英文或数字", code="invalid")],
                            verbose_name="商品名称", error_messages={"invalid": "商品名称必须为英文或数字"})
    # location = models.CharField(max_length=50, verbose_name="产地")
    band = models.ForeignKey(to="Band", related_name="goods", db_constraint=False, db_index=True, verbose_name="品牌")
    price = models.DecimalField(max_digits=9, decimal_places=2, verbose_name="定价")
    tags = models.ManyToManyField(to="Tag", blank=True, related_name="goods", db_constraint=False,
                                  related_query_name="goods", verbose_name="标签")

    class Meta:
        verbose_name = "商品"
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return self.name

    __str__ = __unicode__


class Band(models.Model):
    name = models.CharField(max_length=20, unique=True, verbose_name="品牌")

    class Meta:
        verbose_name = "品牌"
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return self.name

    __str__ = __unicode__


class Tag(models.Model):
    name = models.CharField(max_length=20, unique=True, verbose_name="标签")

    class Meta:
        verbose_name = "标签"
        verbose_name_plural = verbose_name
        # db_table = 'tag'
        # index_together = [("name", )]
        # unique_together = [("name", )]


    def __unicode__(self):
        return self.name

    __str__ = __unicode__

QuerySet 的方法

### 返回一个新的queryset
    - all
        good = Goods.objects.all()
    - filter
        goods = Goods.objects.filter(name = name)
        goods = Goods.objects.filter(price__lt = 20)
        goods = Goods.objects.filter(price__gte = 20)
        goods = Goods.objects.filter(name__iexact = 'iphone')
        goods = Goods.objects.filter(name__contains = 'iphone')
        goods = Goods.objects.filter(name__icontains = 'iphone')
        goods = Goods.objects.filter(name__isnull = True)
        goods = Goods.objects.filter(price__range = [10, 20])
        goods = Goods.objects.filter(name__startswith = 'iphone')
        goods = Goods.objects.filter(band__name = 'quick')
        goods = Goods.objects.filter(Q(name = name) & Q(price = 22))
        goods = Goods.objects.filter(Q(name = name) & ~Q(price = 22))[10:10]
        goods = Goods.objects.filter(create_at__date = datetime.date(2015, 1, 10))
    - exclude
        goods = Goods.objects.exclude(name = name) # 取反
    - order_by
        goods = Goods.objects.order_by('-price')
    - annotate
        orders = Order.objects.filter(goods = goods).annotate(sum_amount = Sum('amount'))
    - extra
        # extra(select, where, params, tables, order_by, select_params)
        Goods.objects.extra(select = {"new_id": "select id from %s"}, select_params = (1, ), where = ["head_line=%s"])
    - distinct
        Goods.objects.distinct("id")
    - reverse
        Goods.objects.order_by("-pk").reverse() # 只有使用了order_by 才可以
    - only
        Goods.objects.filter(pk = 1).only("name") # 只会查取only字段,返回的是QuerySet 当需要查询别的字段时 会再次使用SQL
    - defer # 和only 相反 ,查取的字段是除括号中的字段之外的字段 返回值是一样的
    - using # 使用哪个库
    - union
        q1 = Goods.objects.filter(pk=1)
        q2 = Goods.objects.filter(pk=2)
        q = q1.union(q2) # 具有相同列的才可以union
    - intersection # 交集
        q1  = Goods.objects.filter(pk__lt = 3)
        q2  = Goods.objects.filter(pk__gte = 2)
        q1.intersection(q2)
    - difference # 差集
    - select_for_update
        :param nowait 无需等待即报错 OperationalError: could not obtain lock
        :param skip_locked 无需等待即报错 DoesNotExist: Goods matching query does not exist.
    - select_related # 连表操作  作用与外键
        Goods.objects.select_related("band")
        # SELECT "my_app_goods"."id", "my_app_goods"."name", "my_app_goods"."band_id", "my_app_goods"."price", "my_app_band"."id", "my_app_band"."name" FROM "my_app_goods" INNER JOIN "my_app_band" ON ("my_app_goods"."band_id" = "my_app_band"."id")
    - prefetch_related # 在多对多模型中使用 使用子查询来代替连表操作
        Goods.objects.prefetch_related('tags')
### 执行数据库查询方法
    - iterator
        # 迭代
    - aggregate #聚合
        p = Goods.objects.aggregate(Count('price'))
        p['price__count']
    - count
    - get
    - create
    - bulk_create
    - get_or_create(defaults=None, **kwargs)
    - update_or_create(defaults=None, **kwargs)
    - earliest # 获取最先创建的记录
        earliest(field_name = None)
        如果 field_name 为None 那么从 model 的 get_latest_by 的属性获取字段名称
    - latest # 最新记录
    - first 第一条记录
    - last 最后一条记录
    - in_bulk(id_list = None)
        返回一个以id为键的字典
        Goods.objects.in_bulk([1, 3, 5]) => {1: <Goods: iPhone7>, 3: <Goods: iPhone X>}
        如果id_list 为None 返回所有的值
    - delete
    - update
    - exists return BOOLEAN
### 返回queryset的子类
    - raw raw(self, raw_query, params=None, translations=None, using=None):
        Goods.objects.raw("select * from my_app_goods where name = %s", params = ["iPhone7"])
        params 能用就用可以有效防止SQL注入
        返回的是一个可迭代的对象
    - values
        返回特定字段的结果,相当于SQL中的select
        Goods.objects.values('name', 'price')
        <QuerySet [{'price': Decimal('6300.00'), 'name': u'iPhone7'}]>
    - values_list
        返回的是元祖
        <QuerySet [(u'iPhone7', Decimal('6300.00')), (u'iPhone8', Decimal('6400.00'))]>
    - dates dates(self, field_name, kind, order='ASC')
    - datetimes
    - none
        return <QuerySet []>
### 属性
    - ordered
        是否排序了
    - db
        使用的是哪个db
### OTHER
    - Q
        1. Q((Q(name = name) & Q(age = 21)) | Q(sex = 2))
        2. Q().add(Q(name = name), Q.AND).add(Q(sex = 2), Q.OR)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容