【问题标题】:How can I filter related field in django?如何过滤 django 中的相关字段?
【发布时间】:2019-11-10 05:20:12
【问题描述】:

假设我有模型 User 与模型 Company 具有多对多关系;和模型 UserType,它连接到 User 和 Company。像这样:

class User(models.Model):
    name = models.TextField()

class Company(models.Model):
    name = models.TextField()
    users = models.ManyToManyField(User, related_name="companies")

class UserType(models.Model):
    name = models.TextField()
    company = models.ForeignKey(Company, related_name="user_types")
    users = models.ManyToManyField(User, related_name="user_types")

我想查找公司中的所有用户,这很简单:User.objects.filter(companies=some_company)。但是,我还想过滤返回的用户对象上的 user_types 字段,以便只返回连接到给定公司的 UserType 对象。用代码来解释,应该返回true:

def check_user_types(users, company):
    for user in users:
        for user_type in user.user_types:
            if user_type.company != company:
                return false
    return true

我该怎么做?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    我想通了。对于任何面临同样问题的人,这解决了它:

    from django.db.models import Prefetch
    
    users = User.objects.filter(companies=company).prefetch_related(
        Prefetch(
            "user_types",
            queryset=UserType.objects.filter(company=company),
        )
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-30
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 2019-03-28
      • 2013-07-30
      • 1970-01-01
      相关资源
      最近更新 更多