Набор фильтров отношений Django Many-To-One

У меня есть пара моделей, настроенных так:

Group(models.Model):
    name = models.TextField(max_length=255)

Thing(models.Model):
    location = models.TextField(max_length=255)
    group = models.ForeignKey(Group)

Это всего лишь пример, иллюстрирующий взаимосвязь, так что простите любые синтаксические ошибки.

Мой вопрос в том, как найти группу, которая имеет определенный набор местоположений? Я должен иметь доступ к вещам, связанным с группой, используя:

Group.thing_set

Правильно? Итак, есть ли способ, которым я могу фильтровать, основываясь на том, какие элементы находятся в наборе thing_set? Я думаю что-то в этом роде.

Group.objects.filter(thing_set.location in ["Location A", "Location B"]).all()

Надеюсь, это вернет мне каждую группу, содержащую вещи как из местоположения A, так и из местоположения B. Любые предложения или толчок в правильном направлении будут очень полезны!

Спасибо.


person kevin.w.johnson    schedule 26.05.2015    source источник


Ответы (1)


Согласно документации вы должны использовать имя модели в качестве оператора запроса:

Чтобы обратиться к «обратной» связи, просто используйте имя модели в нижнем регистре.

models.py:

from django.db import models


class Group(models.Model):
   name = models.TextField(max_length=255)


class Thing(models.Model):
    location = models.TextField(max_length=255)
    group = models.ForeignKey(Group)

views.py:

from django.views.generic import ListView


class ReverseFK(ListView):
    model = Group

    def get_queryset(self):
        g = Group.objects.create(name="example")
        g.save()
        Thing.objects.create(location="here", group=g)
        return Group.objects.filter(thing__location__in=["here","there"])

Пример рабочего кода на github

person Sebastian Wozny    schedule 26.05.2015
comment
Это действительно очень близко к тому, что я хочу. Ваш пример очень полезен! Одна проблема заключается в том, что он возвращает группы, в которых есть вещи здесь ИЛИ там. Я бы хотел, чтобы группа возвращалась только в том случае, если в ее наборе есть оба из них. - person kevin.w.johnson; 27.05.2015
comment
Вы меня достаточно в правильном направлении, чтобы понять это. Вот где я нашел окончательное решение своей проблемы: stackoverflow.com/questions/8618068/ - person kevin.w.johnson; 27.05.2015