2017-05-20 7 views
0

の設定外部キーは、のモデルは次のように構築されているとしましょう:JobReferenceを探すことができます私のウェブサイトのユーザーにジャンゴ - IDS

class Worker(models.Model): 
    name_char = models.CharField(max_length=4,null=True, blank=True) 
    body_parts_mtm = models.ManyToManyField('BodyPart') 

class Job(models.Model): 
    job_name = models.CharField(max_length=6,unique=True) 
    job_reference_mtm = models.ManyToManyField('JobReferenceCode') 

class JobReferenceCode(models.Model): 
    job_ref_char = models.CharField(max_length=13) 
    worker_mtm = models.ManyToManyField('Worker') 

class BodyPart(models.Model): 
    body_part_name_text = models.TextField() 

class MembersSimilarity(models.Model): 
    similarity_score_float = models.FloatField(max_length=10) 
    worker_fk = models.ForeignKey(Worker,on_delete=models.CASCADE) 
    job_fk = models.ForeignKey(Job,on_delete= models.CASCADE) 

    #not sure if I need this field to do what I want but here it is: 
    bodypart_fk = models.ForeignKey(BodyPart,on_delete=models.CASCADE) 

、と私は特定の出力させていただきたいと思います。表行数は(Job、[BodyParts])の組み合わせで制御されます。私ビュー上で、それを行うためには

、私はこの問題を解決するために見つけたものだと思うがそれは(簡体字)、この構造を有することを機能させることである。

job_ref_code = 1 
job_query = Job.objects.filter(job_reference_mtm=job_ref_code) 

for job in unique_job_query: 
    sims = MembersSimilarity.objects.filter(job_fk=job) 
    workers_from_sim= Worker.objects.filter(id__in=sims.values('worker_fk')) 
    unique_ids_list = [] 
    for worker in workers_from_sim: 
     combination = set(worker.cath_mtm.all()) 
     if combination not in unique_ids_list: 
      unique_ids_list.append(combination) 
     #All of this "for worker" loop to construct this list; do I need to acces like it ? Let say this list has this structure = [[1,2,3],[1],[1,2]] 
    for body_part_combination in unique_body_ids_list: 
     sim_queryset=MembersSimilarity.objects.filter(job_fk=job_query,bodypart_fk=body_part_combination) 

#Note sim_query_set : if I can access to these similarities here (specific similarities of a job and a combination of body parts, my problem will be solved. 

をそれがすることが可能ですこのようなものをフィルタリングしますか?私は、特定の身体の部分を持つ労働者と各仕事のためのそれを区別する必要があります。私はそれを行う方法を探して何も見つけられませんでした。私はこの質問をして、私のビュー関数を最適化する方法についてのあなたの意見も持っています(例えば、ボディーボディIDの別個のセットを作るためのループ...)

私はこの質問が非常に巨大であることを知っていますが、私は今から数日間苦労しており、さまざまなモデル構造を試しています...どんな助けもありがたくありがとう、ありがとう!

それは私がそれをしなければならない場合、私は知らないが、@Mani助けを借りて、私はどこを検索する場所を見つけることができて、このトピックを見つけました
+0

sim_queryset = MembersSimilarity.objects.filter(job_fk__in = job_query、bodypart_fk__in = combination) – Mani

+0

"Brains、Legs"を持つ労働者は、特定の仕事に対してのみ "Brain"を持つ労働者とは異なります。だから "__in"を使うことはできませんよね? @Mani –

+0

私は混乱しています、あなたは何を達成しようとしていますか?組み合わせはIDのセットですか?あなたが使用できるのであれば。 – Mani

答えて

0

Davor Lucic's answer、最終的には私の問題を解決しました。

私の場合、私は彼の答えをすべて試して、最終的に.filterループを作ることにしました。 は私の質問によると、私はこの問題を解決:

pre_queryset = #a query set of MembersSimilarity 
post_queryset = pre_queryset.filter(job_fk=1,bodypart‌​_fk=1 AND 2) 

レッツは、私がbody_part_fkのリストを持っている、とpre_querysetを超えるフィルタ処理したいと言う:

list_ids=[1,2] 
i=0 
while i < len(list_ids)-1: 
    if i==0: #use the prequeryset 
     post_queryset = pre_queryset.filter(job_fk=job,bodypart_fk=list_ids[i]) 
    else: 
     post_queryset = post_queryset.filter(job_fk=job,bodypart_fk=list_ids[i]) 
    i+=1