Django:从QuerySet中拾取而不进行切片
我在Django有以下基本型号:Django:从QuerySet中拾取而不进行切片,django,filtering,django-queryset,slice,Django,Filtering,Django Queryset,Slice,我在Django有以下基本型号: class Group(models.Model): class People(models.Model): groups = models.ManyToManyField(Group, related_name='members') class Cars(models.Model): groups = models.ManyToManyField(Group, related_name='vehicles') 我想从一些群体中选择一定数量
class Group(models.Model):
class People(models.Model):
groups = models.ManyToManyField(Group, related_name='members')
class Cars(models.Model):
groups = models.ManyToManyField(Group, related_name='vehicles')
我想从一些群体中选择一定数量的人和车。我保存在列表中的组和相应比例:
groups = [ some groups ]
proportion_pps = [ some positive integer list ]
proportion_cars = [ some positive integer list ]
现在,我选择的代码如下所示:
for x, group in enumerate(groups):
pps |= People.objects.filter(groups=grop).all().order_by('?')#[:proportion_pps[x - 1]]
crs |= Cars.objects.filter(groups=group).all().order_by('?')#[:proportion_crs[x - 1]]
到目前为止还不错。。。但现在我在尝试时遇到了“切片”错误:
pps.distinct()
crs.distinct()
或者类似于:
list_pps = list(pps.values_list('id', flat=True).order_by('?'))
我看没有办法。任何帮助都将不胜感激。。。谢谢 根据使用的数据库,您可以使用:
#[:proportional_pps[x-1]]
应该做什么?我忘了删除to comment标签(#),以防你是这个意思。否则,比如说[:7]
,我只想随机选择这个组中的7个元素。到目前为止,你的建议有效,但现在我遇到了麻烦:list\u pps=list(pps.values\u list('id',flat=True)。order\u by('?')
,它说复合语句的子查询中不允许使用限制/偏移。@zeus:在并集之后进行排序会很棘手。但是,如果您使用的是list
,那么它就没有必要了,因为这样您就可以简单地在Python/Django级别.Thx上进行洗牌。但是,如果没有排序,list\u id也无法工作:list\u pps=list(pps.values\u list('id',flat=True))
运行到相同的error@zeus:来自随机导入数据;数据=[p.pk表示pps中的p];洗牌(数据)
我确实导入了随机
,因为来自随机导入数据的给了我一个错误(在“random.pyi”中找不到引用“data”
)。然后,您的suggestsdata=
命令被执行,但我遇到了与之前相同的限制/offest错误。
people = People.objects.none().union(*[
People.objects.filter(groups=group).all().order_by('?')[:n]
for group, n in zip(groups, proportion_pps)
])