处理与选择相关的预取,半自动
django-aggressivequer的Python项目详细描述
(这是实验包)
处理与选择相关的预取,半自动创建。
fromdjango_aggressivequeryimportfrom_queryset(from_queryset(UserInfo.objects.filter(point__gt=0),["user__teams__games"]).prefetch_filter(user__teams__games=lambdaqs:qs.filter(name__contains="-a")))# almost same meansfromdjango.db.modelsimportPrefetch(UserInfo.objects.filter(point__gt=0).select_related("user").prefetch_related("user__teams",Prefetch("user__teams__games",queryset=Game.objects.filter(name__contains="-a"))))
SQL示例
SELECT"userinfo"."id","userinfo"."point","userinfo"."ctime","userinfo"."user_id","user"."id","user"."name","user"."ctime"FROM"userinfo"INNERJOIN"user"ON("userinfo"."user_id"="user"."id")WHERE"userinfo"."point">0;SELECT("team_users"."user_id")AS"_prefetch_related_val_user_id","team"."id","team"."name","team"."price","team"."ctime"FROM"team"INNERJOIN"team_users"ON("team"."id"="team_users"."team_id")WHERE"team_users"."user_id"IN(2);SELECT"game"."id","game"."team_id","game"."name","game"."price","game"."ctime"FROM"game"WHERE("game"."name"LIKE'%-a%'ESCAPE'\'AND"game"."team_id"IN(1,2));
型号
# relation: UserInfo - User *-* Team -* GameclassUser(models.Model):name=models.CharField(max_length=255,default="",null=False)ctime=models.DateTimeField()classUserInfo(models.Model):point=models.IntegerField(null=False,default=0)user=models.OneToOneField(User,related_name="info")ctime=models.DateTimeField()classTeam(models.Model):users=models.ManyToManyField(User,related_name="teams")name=models.CharField(max_length=255,default="",null=False)price=models.IntegerField(null=False,default=0)ctime=models.DateTimeField()classGame(models.Model):team=models.ForeignKey(Team,related_name="games")name=models.CharField(max_length=255,default="",null=False)price=models.IntegerField(null=False,default=0)ctime=models.DateTimeField()
更具体的选项
使用更多特定的选项从@queryset()调用,然后使用query.only()。
fromdjango_aggressivequeryimportfrom_queryset(from_queryset(UserInfo.objects.filter(point__gt=0),["point","user__name","user__teams__name","user__teams__games__name"],more_specific=True).prefetch_filter(user__teams__games=lambdaqs:qs.filter(name__contains="-a")))
0.3.1:
- 在发现意外关系时修复错误。
0.3.0条: -修复出现重复提示的错误 -修复未使用方法的错误 -正在添加扩展功能。 -作为扩展重新实现 -实现自定义预取()作为扩展 -作为扩展重新实现预取过滤器 -(模块分离)
0.2.0条: -跳过函数支持(aggressivequery.skip_filter())
0.1.2条: -温和的类型检查,在from_query()
0.1.1条 -删除无需连接(预取时已释放)
0.1分 -首次发布