【问题标题】:How to properly filter reversed ManyToMany?如何正确过滤反向多对多?
【发布时间】:2016-04-19 09:35:09
【问题描述】:

我不知道如何在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

【问题讨论】:

    标签: python django python-2.7 django-models


    【解决方案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(...)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 它会引发异常,我会自己检查异常,但我完全不明白这是如何工作的。异常值:无法将关键字“language_levels”解析为字段。选项有:id、language、language_id、level、level_id、price_multiplier、translators
      • 对不起UserProfile.objects.all().values('language_levels__id')
      • 哦,是的,确实有道理。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2014-07-17
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多