2017-05-20 1 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. 

를이 가능하다 이런 식으로 걸러 내시겠습니까? 나는 구체적인 신체 부위와 각 직업에 대한 세부 사항을 가진 노동자들과 구별 할 필요가있다. 어떻게 해야할지 찾고 아무 것도 찾지 못했습니다.이 뷰어 함수를 최적화하는 방법에 대한 의견을 듣기 위해이 질문을하고 있습니다 (예 : 신체 분열 아이디의 고유 한 집합을 구성하는 루프 ...)

나는이 질문이 아주 거대하다는 것을 알고 있지만, 지금부터 며칠 째 고생하고 있으며, 다른 모델 구조를 많이 시도했다. 어떤 도움이라도 고맙다는 것 이상은 감사 할 것이다.

+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

만약 내가 할 필요가 있는지 모르겠지만 @Mani 도움, 내가 어디서 찾아야 찾을 수 있었습니다이 주제를 발견 : 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