【发布时间】: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