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 до версии следует использовать .annotate(…) [Django-doc] вместо .alias(…) [Django-doc].

Вернуться на верх