Как я могу отфильтровать связанные поля в Django? - PullRequest
0 голосов
/ 28 июня 2019

Скажем, у меня есть пользователь модели, который имеет отношение "многие ко многим" с компанией модели;и модель UserType, которая связана как с пользователем, так и с компанией.Например:

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

Как бы я это сделал?

1 Ответ

0 голосов
/ 28 июня 2019

Я понял это.Для тех, кто столкнулся с той же проблемой, это решило:

from django.db.models import Prefetch

users = User.objects.filter(companies=company).prefetch_related(
    Prefetch(
        "user_types",
        queryset=UserType.objects.filter(company=company),
    )
)
...