簡體   English   中英

Django-外鍵,一組ID

[英]Django - Foreign key, set of 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)

在我的網站上,用戶可以查找JobReference,我想給出一個特定的輸出:一個表,其中的行數由(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.

是否可以過濾這樣的東西? 我需要區分具有特定身體部位的工人,並針對每項工作進行區分。 我一直在尋找方法,卻沒有找到任何東西,我也在問這個問題,以征詢您對如何優化我的視圖函數的意見(例如;循環以構造不同的bodypart id集...)

我知道這個問題相當大,但是從現在開始我一直在苦苦掙扎,並且嘗試了許多不同的模型結構...任何幫助都將不勝感激,謝謝!

我不知道是否必須這樣做,但是在@Mani的幫助下,我能夠找到要查找的地方,並找到了這個主題: Davor Lucic的答案 ,終於解決了我的問題。

以我為例,我嘗試了所有他的答案,最后選擇制作一個.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM