如何正确过滤反向的多个?

2024-06-28 11:22:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道如何在Django中过滤反向的ManyToMany。我想获取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

Tags: django语言modellenobjectsmodelslevellanguage
2条回答

我想你正在寻找这样的东西:

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(...)

不能使用django orm按M2M字段进行筛选。相反,您可以遵循此解决方法

LanguageLevel.objects.all().values('language_levels__id')

相关问题 更多 >