2014-04-29 49 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()')