Django filter queryset __in=list for *every* item in queryset
Django filter queryset __in=list for *every* item in 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)
如何使用 UserProfile
的实例过滤 Offer.objects
,使 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(<strong>skills_required__userprofile=<em>my_userprofile</em></strong>),
distinct=True
)
).filter(
<strong>req_skill=F('skills')</strong>
)
对于 django-3.2, you should use .annotate(…)
[Django-doc] instead of .alias(…)
[Django-doc].
之前的 Django
假设我有以下型号
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)
如何使用 UserProfile
的实例过滤 Offer.objects
,使 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(<strong>skills_required__userprofile=<em>my_userprofile</em></strong>),
distinct=True
)
).filter(
<strong>req_skill=F('skills')</strong>
)
对于 django-3.2, you should use .annotate(…)
[Django-doc] instead of .alias(…)
[Django-doc].