#python #django #algorithm #django-models #django-views
#python #django #алгоритм #django-модели #django-представления
Вопрос:
Мои модели:
Item:
name
desc
Type:
name
Value:
text
type.ForeignKey(Type)
item = ForeignKey(Item)
У меня был первоначальный список типов из table Type, предположим, t = [4,5,6]. Теперь я должен получить список элементов, типы которых равны t. Например:
Список данных значения:
type | item
4 1
5 1
6 1
4 2
5 2
4 3
Итак, если t = [4,5,6], результат, который мне нужен, это items = [<object: 1>]
Обновить:
t = [4,5] items = [<object: 1>, <object: 2>]
t = [4] items = [<object: 1>, <object: 2>, <object: 3>]
Спасибо за любую помощь!!!
Комментарии:
1. Му решение работает именно так, как вы хотите (в разделе обновления тоже). Или это не так?
2. Я собираюсь протестировать 🙂 Спасибо, друг!
Ответ №1:
Не совсем уверен, что это лучшее решение, но оно работает
from itertools import groupby
values = Value.objects.filter(type_id__in=t).values_list('type_id', 'item_id')
values = sorted(values, key=lambda x: x[1])
items = []
for key, group in groupby(values, lambda x: x[1]):
types = [x[0] for x in group]
if set(t).issubset(set(types)):
items.append(key)
items
будет содержать идентификаторы, а не объекты, но я не думаю, что это может быть проблемой.
Ответ №2:
Вы можете фильтровать по отношению многие ко многим, значение которого равно:
Item.objects.filter(value__type__id__in = [4, 5, 6])
Обновление: Вышеуказанное будет работать для запроса OR, чтобы найти все элементы, которые имеют ЛЮБОЙ из указанных типов. Чтобы найти все элементы, которые имеют ВСЕ типы, вы должны создать запрос И, связав фильтры:
q = Item.objects
for id in [4, 5, 6]:
q = q.filter(value__type__id = id)
print q.all()
# or
q = reduce(lambda q, i: q.filter(value__type__id = i), [4, 5, 6], Item.objects)
print q.all()
Комментарии:
1. И получить элементы, которые имеют типы [4], [4, 5], [5, 6] и т.д. Но задача другая.