2014-04-29 16 views
0

我想获取一个随机的对象列表并将其用作表单字段的查询集。但既然它是一个列表而不是查询集,这将无法工作。一位朋友建议为此使用经理。但现在我不太确定从哪里开始。django使用管理器来获取自定义查询集

我的函数来获得“查询集”的文章:

def get_job_list(): 
    all_jobs = ShortJob.objects.exclude(rarity__exact=0) 
    always = ShortJob.objects.filter(rarity=0) 
    pick_list = [] 
    job_list = [] 

    for job in all_jobs: 
     pick_list.extend([job] * job.rarity) 

    counter = 0 
    while counter < 5: 
     counter += 1 
     job = choice(pick_list) 
     job_list.append(job) 

     while job in pick_list: 
      pick_list.remove(job) 

    for job in always: 
     job_list.append(job) 

    return job_list 

和我的形式:

class ShortJobForm(forms.Form): 

    options = forms.ModelChoiceField(queryset=ShortJob.get_job_list, widget=forms.RadioSelect) 

可有人请点我在正确的方向来解决这个问题

我尝试到目前为止重写功能到管理器:

class ShortJobManager(models.Manager): 
""" create a random short job queryset""" 

    def get_queryset(self): 
     all_jobs = ShortJob.objects.exclude(rarity__exact=0) 
     always = ShortJob.objects.filter(rarity=0) 
     pick_list = [] 
     job_list = [] 

     for job in all_jobs: 
      pick_list.extend([job] * job.rarity) 

     counter = 0 
     while counter < 5: 
      counter += 1 
      job = choice(pick_list) 
      job_list.append(job) 

      while job in pick_list: 
       pick_list.remove(job) 

     for job in always: 
      job_list.append(job) 

     return super(ShortJobManager, self).get_queryset(job_list) 
+0

好的。我在代码中看不到任何管理器。 – ElmoVanKielmo

+0

好点我忘了那一个。但就如你所见,我不太清楚如何解决这个问题。 –

回答

1

你可以改变你get_job_list()函数像这样,所以它返回一个QuerySet:

def get_job_list(): 
    all_jobs = ShortJob.objects.exclude(rarity__exact=0) 
    always = ShortJob.objects.filter(rarity=0) 
    pick_list = [] 
    pk_list = [] 

    for job in all_jobs: 
     pick_list.extend([job.pk] * job.rarity) # list of pks 

    counter = 0 
    while counter < 5: 
     counter += 1 
     job_pk = choice(pick_list) 
     pk_list.append(job_pk) 

     while job_pk in pick_list: 
      pick_list.remove(job_pk) 

    # pk_list is now a list of pks you can filter on 
    return always.filter(pk__in=pk_list) 

东西大致类似。我试图保持你的功能的目的,但可能在某些地方误解了它。要点是:

你可以选择随机pks然后筛选它们以获得查询集。

+0

这听起来很合逻辑,我试了一下。为什么当你可以很容易地做到这一点很困难 –

+0

@HansdeJong编辑功能不是用来改变答案 - 它是为了提高可读性和语法等。 – ElmoVanKielmo

+0

有用的发布我的代码的最终版本,我得到了他的帮助?或者就这样离开它? –

0

我建议你可以用raw qs包含UNION部分。像这样:

ShortJob.objects.raw('SELECT * FROM myapp_shortjob WHERE rarity=0 UNION SELECT * FROM myapp_shortjob WHERE rarity!=0 ORDER BY random()')