一种对象,它允许链接多个iterable,以便作为queryset兼容对象懒洋洋地为它们服务。
dj.chain的Python项目详细描述
快速启动
让我们从一个例子开始。假设我们有几个抽象的数据库模型 这使我们可以在以后重用字段:
class Titled(db.Model): title = db.CharField(max_length=100) class Meta: abstract = True class Dynamic(db.Model): duration = db.PositiveIntegerField() class Meta: abstract = True
我们还有一些具体的数据库模型,它们共享这些字段:
class Video(Titled, Dynamic): RESOLUTION = ( (1, '240p'), (2, '320p'), (3, '480p'), (4, '720p'), (5, '1080p') ) author = db.CharField(max_length=100) resolution = db.IntegerField(choices=RESOLUTION) class Song(Titled, Dynamic): GENRE = ( (1, 'Country'), (2, 'Folk'), (3, 'Polka'), (4, 'Western'), (5, 'World') ) artist = db.CharField(max_length=100) genre = db.IntegerField(choices=GENRE)
我们的数据库已经包含一些数据:
>>> Video.objects.all() [<Video: Psy - Gangnam Style (253 s at 1080p)>, <Video: Justin Bieber - Baby (225 s at 720p)>, <Video: Lady Gaga - Bad Romance (308 s at 320p)>, <Video: Shakira - Waka Waka (211 s at 480p)>] >>> Song.objects.all() [<Song: Gotye feat. Kimbra - Somebody That I Used to Know (244 s; Folk)>, <Song: Coldplay - Clocks (307 s; Polka)>, <Song: Muse - Madness (279 s; Country)>, <Song: Florence + The Machine - Spectrum (218 s; Folk)>]
基本链
让我们创建一个简单的链:
>>> from dj.chain import chain >>> media = chain(Video.objects.all(), Song.objects.all())
我们可以对其集体调用QuerySet相关方法:
>>> media.count() 8
我们还可以进一步过滤:
>>> list(media.filter(duration__gt=250)) [<Video: Psy - Gangnam Style (253 s at 1080p)>, <Video: Lady Gaga - Bad Romance (308 s at 320p)>, <Song: Coldplay - Clocks (307 s; Polka)>, <Song: Muse - Madness (279 s; Country)>]
检查累计长度:
>>> media.filter(duration__gt=250).count() 4
使用索引和切片:
>>> media.filter(duration__gt=250)[1] <Video: Lady Gaga - Bad Romance (308 s at 320p)> >>> list(media[3:6]) [<Video: Shakira - Waka Waka (211 s at 480p)>, <Song: Gotye feat. Kimbra - Somebody That I Used to Know (244 s; Folk)>, <Song: Coldplay - Clocks (307 s; Polka)>] >>> list(media[1::3]) [<Video: Justin Bieber - Baby (225 s at 720p)>, <Song: Gotye feat. Kimbra - Somebody That I Used to Know (244 s; Folk)>, <Song: Florence + The Machine - Spectrum (218 s; Folk)>]
使用累积排序和筛选:
>>> list(media.order_by('title')) [<Video: Justin Bieber - Baby (225 s at 720p)>, <Video: Lady Gaga - Bad Romance (308 s at 320p)>, <Song: Coldplay - Clocks (307 s; Polka)>, <Video: Psy - Gangnam Style (253 s at 1080p)>, <Song: Muse - Madness (279 s; Country)>, <Song: Gotye feat. Kimbra - Somebody That I Used to Know (244 s; Folk)>, <Song: Florence + The Machine - Spectrum (218 s; Folk)>, <Video: Shakira - Waka Waka (211 s at 480p)>] >>> list(media.order_by('-duration').filter(duration__lt=300)) [<Song: Muse - Madness (279 s; Country)>, <Video: Psy - Gangnam Style (253 s at 1080p)>, <Song: Gotye feat. Kimbra - Somebody That I Used to Know (244 s; Folk)>, <Video: Justin Bieber - Baby (225 s at 720p)>, <Song: Florence + The Machine - Spectrum (218 s; Folk)>, <Video: Shakira - Waka Waka (211 s at 480p)>]
等
连锁异基因位点
我们可以将非查询集的iterable添加到群:
class Titled(db.Model): title = db.CharField(max_length=100) class Meta: abstract = True class Dynamic(db.Model): duration = db.PositiveIntegerField() class Meta: abstract = True0
在这种情况下,还可以使用累积排序。你唯一需要做的就是 请记住,不是查询集的iterables应该预先分类 要正确排序的累积结果。例如:
class Titled(db.Model): title = db.CharField(max_length=100) class Meta: abstract = True class Dynamic(db.Model): duration = db.PositiveIntegerField() class Meta: abstract = True1
您还可以使用累积 值 和 值列表 转换:
class Titled(db.Model): title = db.CharField(max_length=100) class Meta: abstract = True class Dynamic(db.Model): duration = db.PositiveIntegerField() class Meta: abstract = True2
自定义筛选、排序和转换
链提供在产生值时使用的特殊可重写静态方法:
- xfilter(value) -仅当 xfilter(value) 返回时才产生值 正确 。请参阅下面的已知问题。
- xform(value) -在返回之前转换值jit。它是 只调用指定切片内的值以及 过滤器
- xkey(value) -返回要在元素之间进行比较的值,如果 应该使用排序。应为 要正确排序的完整结果。任何累积 order_by 子句都是 在使用 xkey 方法之前执行。