【问题标题】:Django - Foreign key, set of idsDjango - 外键,一组 id
【发布时间】:2017-10-20 18:07:32
【问题描述】:

假设模型是这样构造的:

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 集......)

我知道这个问题非常大,但是从现在开始我一直在苦苦挣扎,并尝试了很多不同的模型结构......任何帮助都将不胜感激,谢谢!

【问题讨论】:

  • sim_queryset=MembersSimilarity.objects.filter(job_fk__in=job_query,bodypart_fk__in=combination)
  • 拥有“Brains,Legs”的工人与那些只为特定工作而拥有“Brain”的工人不同。所以不能使用“__in”,对吧? @Mani
  • 我很困惑,你想完成什么?组合是一组ID吗?如果是的话,你可以在里面使用。
  • 我错了吗?如果出现这种情况:queryset1=MembersSimilarity.objects.filter(job_fk=1,bodypart_fk__‌​in=1,2) 必须严格提供作业 id = 1、BodyPart id = 1 和 2 的 sim,并且此 __in 执行类似于 queryset1 的操作'=MembersSimilarity.objects.filter(job_fk=1,bodypart_fk​=1) 然后 queryset1''=MembersSimilarity.objects.filter(job_fk=1,bodypart_fk__‌​in=2) 不是吗? @Mani 最后,这个查询将产生 JOB id= 1 和 BodyPart = 1 的 objetcs
  • bodypart_fk__in =[1,2] 表示 bodypart_fk=1 或 bodypart_fk=2 然后将其与 AND 与 job_fk=1 结合

标签: python django django-models django-views django-queryset


【解决方案1】:

我不知道我是否必须这样做,但在@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2016-09-12
    • 2022-01-24
    • 1970-01-01
    • 2021-12-24
    • 2023-03-27
    • 2013-10-24
    相关资源
    最近更新 更多