[英]How to properly filter reversed ManyToMany?
I can't figure out how to filter reversed ManyToMany
in Django
. 我不知道如何在Django
过滤反向的ManyToMany
。 I want to get LanguageLevel
objects, connected with at least one UserProfile
. 我想获得LanguageLevel
对象,并与至少一个UserProfile
连接。
In human: All languages such as at least one User can speak this Language. 人工语言:所有语言(例如至少一种用户)都可以使用该语言。
I have a model: 我有一个模型:
class LanguageLevel(models.Model):
...
and 和
class UserProfile(models.Model):
...
language_levels = models.ManyToManyField('LanguageLevel', blank=True, related_name='translators')
...
Already tried: 已经尝试过:
active_language_levels = LanguageLevel.objects.filter(lambda x: len(x.translators)!=0)
AND 和
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
I think you are looking for something like this: 我认为您正在寻找这样的东西:
from django.db.models import Count
LanguageLevel.objects.all() \
.annotate(translators_count=Count('translators__id')) \
.filter(translators_count__gte=1)
Just add proper link on translators__id
to count distinct entries of each user. 只需在translators__id
上添加适当的链接即可计算每个用户的不同条目。
If you want to select languages for specific user, just pass proper queryset before annotate: 如果要为特定用户选择语言,只需在注释前传递正确的查询集即可:
LanguageLevel.objects.filter(translators__id=user_id)
.annotate(...)
You cannot filter by a M2M field using django orm. 您无法使用django orm按M2M字段进行过滤。 Instead you can follow this workaround, 相反,您可以按照以下解决方法进行操作,
LanguageLevel.objects.all().values('language_levels__id')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.