我无法弄清楚如何过滤ManyToMany
中的反转Django
。我想获得LanguageLevel
个对象,与至少一个UserProfile
相关联。
在人类中:所有语言(例如至少一个用户)都可以说这种语言。
我有一个模特:
class LanguageLevel(models.Model):
...
和
class UserProfile(models.Model):
...
language_levels = models.ManyToManyField('LanguageLevel', blank=True, related_name='translators')
...
已经尝试过:
active_language_levels = LanguageLevel.objects.filter(lambda x: len(x.translators)!=0)
和
for language_level in LanguageLevel.objects.all():
print language_level.translators
if len(language_level.translators)>0:
print 'ok'
print language_level
else:
print 'no'
print language_level
答案 0 :(得分:1)
我认为你正在寻找这样的东西:
from django.db.models import Count
LanguageLevel.objects.all() \
.annotate(translators_count=Count('translators__id')) \
.filter(translators_count__gte=1)
只需在translators__id
上添加适当的链接即可计算每个用户的不同条目。
如果要为特定用户选择语言,只需在注释之前传递正确的查询集:
LanguageLevel.objects.filter(translators__id=user_id)
.annotate(...)
答案 1 :(得分:0)
您无法使用django orm按M2M字段进行过滤。相反,您可以遵循此解决方法,
LanguageLevel.objects.all().values('language_levels__id')