Вы добавляете в цепочку еще один filter
в конце, как это:
class spacelist(LoginRequiredMixin,ListView):
model=Adspace
template_name='adspace_list.html'
def get_queryset(self):
query_set = super().get_queryset()
query_set = query_set.filter(user=self.request.user)
app_id = [...]
return query_set.filter(app_id=app_id)
Осталась проблема, чтобы выяснить, из чего исходит app_id
.Как вы узнаете, что такое текущее приложение?Несколько вариантов здесь.
Вариант 1: из запроса
Может исходить от текущего пользователя: self.request.user.appname.all()
, но это даст вам несколько приложений, если у пользователя может быть только одно приложение,Вы должны изменить свою модель Appname.user
на OneToOneField
.
В противном случае я предлагаю изменить related_name='appnames'
, чтобы отразить кратность в обратной взаимосвязи.
Вариант 2: из URL
Он может быть получен из URL, вашегопредставление списка пространств должно извлечь параметр app_id
из URL-адреса, где он определен:
url(r'^(?P<app_id>[0-9]+)/spaces/$', spacelist.as_view(), name='space_list'),
А затем в представлении пространства-списка вы получите этот параметр следующим образом:
app_id = self.kwargs['app_id']
return query_set.filter(app_id=app_id)
Надеюсь, что это поможет
ОБНОВЛЕНИЕ:
Также стоит отметить, что QuerySets являются ленивыми , что означает, что результат будет оценен Django как можно позже.Поэтому при вызове:
query_set = query_set.filter(user=self.request.user)
ORM Django еще не выполняет никаких запросов к БД, и после этого вы можете связать больше фильтров:
query_set = query_set.filter(user=self.request.user)
query_set = query_set.filter(app_id=app_id)
Что за кадромрасширение запроса на выполнение при необходимости.Но на данный момент ни один запрос на самом деле не выполняется.Чтобы увидеть запрос, который будет выполнен, вы можете распечатать атрибут query
QuerySet:
print(query_set.query)
, который должен регистрировать что-то вроде:
SELECT "app_adspace"."user_id" ...
FROM
"app_adspace"
WHERE
"app_adspace"."user_id" = 1234 AND "app_adspace"."app_id" = 5678