python集合操作 读取_python – Django – 如何使用QuerySet过滤来获取对象的子集?...
根據(jù)
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最終會返回重復(fù)的記錄,這不是我想要的.我的問題是獲得子集的正確方法是什么? (注意:按定義設(shè)置不會出現(xiàn)多次出現(xiàn)的同一個對象)
解釋為什么它的行為也會很好,因為我過濾意味著你在Python中使用filter()內(nèi)置函數(shù)實現(xiàn)了什么.這是:采取滿足要求的元素(換句話說,丟棄不符合要求的元素).而這個定義似乎不允許引入/復(fù)制對象.
我知道可以完全區(qū)分(),但仍然導(dǎo)致相當(dāng)丑陋(可能比可能更慢)查詢:
>>> 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聊天之后,結(jié)論是我的問題是我希望filter()根據(jù)字典定義來表現(xiàn).并且它是如何在Python或任何其他理智的框架/語言中工作的.
更確切地說,如果我設(shè)置A = {x,y,z}并且我調(diào)用A.filter(< predicate>),我不希望任何元素被復(fù)制.使用Django的QuerySet,但它的行為如下:
A = {x,y,z}
A.filter( )
# now A i.e. = {x,x}
所以首先問題是不合適的方法名稱(比如match()會更好).
第二件事是我認為創(chuàng)建比Django允許的更有效的查詢是可能的.我可能錯了,如果我有一點時間,我可能會嘗試檢查是否屬實.
總結(jié)
以上是生活随笔為你收集整理的python集合操作 读取_python – Django – 如何使用QuerySet过滤来获取对象的子集?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京东超市和天猫超市哪个好 京东超市和天猫
- 下一篇: WIN7如何定时运行指定软件(电脑自动关