フィールド (またはリスト)のすべての要素が別のフィールドに存在するかどうかを確認する Django クエリを作成する最良の方法について、私はかなり困惑しています。ManyToMany
ManyToMany
例として、私は複数Person
の専門分野を持つことができる複数の を持っています。開始できるもありますがJob
、開始するには 1 つ以上Specialty
の が適格である必要があります。
class Person(models.Model):
name = models.CharField()
specialties = models.ManyToManyField('Specialty')
class Specialty(models.Model):
name = models.CharField()
class Job(models.Model):
required_specialties = models.ManyToManyField('Specialty')
仕事に必要なすべての専門性を持っている場合にのみ、人は仕事を始めることができます。ここでも例として、3 つの専門分野があります。
- コーディング
- 歌う
- ダンシング
そして、私はJob
歌と踊りの専門を必要とする を持っています。歌と踊りが得意な人なら始められますが、コーディングと歌が得意な人は始められません。
そのため、人が引き受けることができるすべての仕事を見つける方法が必要です。これが私のやり方でしたが、もっとエレガントなアプローチがあると確信しています:
def jobs_that_person_can_start(person):
# we start with all jobs
jobs = Job.objects.all()
# find all specialties that this person does not have
specialties_not_in_person = Specialty.objects.exclude(name__in=[s.name for s in person.specialties])
# and exclude jobs that require them
for s in specialties_not_in_person:
jobs = jobs.exclude(specialty=s)
# the ones left should fill the criteria
return jobs.distinct()
これは、 を使用すると、その人の専門分野のすべてではなく、いずれかJob.objects.filter(specialty__in=person.specialties.all())
の専門分野に一致する仕事が返されるためです。このクエリを使用すると、歌と踊りを必要とするジョブが歌のコーダーに表示されますが、これは望ましい出力ではありません。
この例が複雑すぎないことを願っています。私がこれについて心配している理由は、システム内の専門分野がおそらくもっと多くなり、それらをループすることがこれを達成するための最良の方法とは思えないからです. 誰かこのかゆみにかすり傷をつけてくれませんか!