基于多对多过滤并避免重复

时间:2019-04-27 06:07:21

标签: django django-models

我对使用“很多”字段是陌生的,我真的找不到一个很好的示例来说明如何继续执行此任务。

我目前有两个模型modelJobmodelSkillSubscription,现在modelJob包含技能领域的“众筹”领域。

我想做的是 如果modelSkillSubscription包含我获得的任何技能,请检索。说modelJob包含[SkillA,SkillB,SkillC]。我想将其传递给过滤器,并从列表中获取所有包含modelSkillSubscription的技能,避免重复。

class modelJob(models.Model):
    skills              = models.ManyToManyField(modelSkill,blank=True)


class modelSkillSubscription(models.Model):
    employer            = models.ForeignKey(modelEmployer, on_delete=models.CASCADE, default=None, blank=True)
    skills              = models.ManyToManyField(modelSkill, blank=True)

关于如何实现此目标的任何建议?

1 个答案:

答案 0 :(得分:0)

您可以根据现有的SkillSubscription实例过滤Job模型(我将删除开头的model,从而使模型名称更短并与Python“ CamelCase”类命名兼容惯例):

job = Job.objects.get(id=1)
subscriptions = (SkillSubscription.objects
    .filter(skills__in=job.skills.all())
    .distinct()
)

这将选择所有与工作至少具有一项共同技能的订阅。

如果您知道过滤条件,还可以将作业选择包装在同一查询中:

subscriptions = (SkillSubscription.objects
    .filter(skills__in=Job.objects.filter(
                                      # your filter criteria
                                  )
                                  .values('skills'))
    .distinct()
)