Django filter queryset __in=list для *каждого* элемента в queryset
Допустим, у меня есть следующие модели
class Offer(models.Model):
skills_required = models.ManyToManyField(Skill, blank=True)
class Skill(models.Model)
title = models.CharField(max_length=80, primary_key=True)
class UserProfile(models.Model):
skills = models.ManyToManyField(Skill)
Как я могу отфильтровать Offer.objects
с помощью экземпляра UserProfile
таким образом, чтобы skills_required
оставшихся предложений было подмножеством user_profile.skills
?
Мы можем подсчитать количество необходимых навыков для данного предложения и проверить, равно ли количество навыков количеству навыков для данного профиля пользователя с:
from django.db.models import Count, F, Q
Offer.objects.alias(
req_skill=Count('skills_required', distinct=True),
skills=Count(
'skills_required',
filter=Q(skills_required__userprofile=my_userprofile),
distinct=True
)
).filter(
req_skill=F('skills')
)
Для Django до версии django-3.2 следует использовать .annotate(…)
[Django-doc] вместо .alias(…)
[Django-doc].