日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python集合操作 读取_python – Django – 如何使用QuerySet过滤来获取对象的子集?...

發布時間:2023/12/15 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python集合操作 读取_python – Django – 如何使用QuerySet过滤来获取对象的子集?... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

根據

documentation:

filter(**kwargs) Returns a new QuerySet containing objects that match

the given lookup parameters.

The lookup parameters (**kwargs) should be in the format described in

Field lookups below. Multiple parameters are joined via AND in the

underlying SQL statement.

對我來說,這表明它將返回原始集合中的項目子集.

但是我似乎錯過了一些東西,因為下面的示例并不像我期望的那樣:

>>> kids = Kid.objects.all()

>>> tuple(k.name for k in kids)

(u'Bob',)

>>> toys = Toy.objects.all()

>>> tuple( (t.name, t.owner.name) for t in toys)

((u'car', u'Bob'), (u'bear', u'Bob'))

>>> subsel = Kid.objects.filter( owns__in = toys )

>>> tuple( k.name for k in subsel )

(u'Bob', u'Bob')

>>> str(subsel.query)

'SELECT "bug_kid"."id", "bug_kid"."name" FROM "bug_kid" INNER JOIN "bug_toy" ON ("bug_kid"."id" = "bug_toy"."owner_id") WHERE "bug_toy"."id" IN (SELECT U0."id" FROM "bug_toy" U0)'

正如你在上面看到的那樣,subsel最終會返回重復的記錄,這不是我想要的.我的問題是獲得子集的正確方法是什么? (注意:按定義設置不會出現多次出現的同一個對象)

解釋為什么它的行為也會很好,因為我過濾意味著你在Python中使用filter()內置函數實現了什么.這是:采取滿足要求的元素(換句話說,丟棄不符合要求的元素).而這個定義似乎不允許引入/復制對象.

我知道可以完全區分(),但仍然導致相當丑陋(可能比可能更慢)查詢:

>>> str( subsel.distinct().query )

'SELECT DISTINCT "bug_kid"."id", "bug_kid"."name" FROM "bug_kid" INNER JOIN "bug_toy" ON ("bug_kid"."id" = "bug_toy"."owner_id") WHERE "bug_toy"."id" IN (SELECT U0."id" FROM "bug_toy" U0)'

我的models.py完整性:

from django.db import models

class Kid(models.Model):

name = models.CharField(max_length=200)

class Toy(models.Model):

name = models.CharField(max_length=200)

owner = models.ForeignKey(Kid, related_name='owns')

編輯:

在與@limelight聊天之后,結論是我的問題是我希望filter()根據字典定義來表現.并且它是如何在Python或任何其他理智的框架/語言中工作的.

更確切地說,如果我設置A = {x,y,z}并且我調用A.filter(< predicate>),我不希望任何元素被復制.使用Django的QuerySet,但它的行為如下:

A = {x,y,z}

A.filter( )

# now A i.e. = {x,x}

所以首先問題是不合適的方法名稱(比如match()會更好).

第二件事是我認為創建比Django允許的更有效的查詢是可能的.我可能錯了,如果我有一點時間,我可能會嘗試檢查是否屬實.

總結

以上是生活随笔為你收集整理的python集合操作 读取_python – Django – 如何使用QuerySet过滤来获取对象的子集?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。