агрегация и фильтрация джанго результата - PullRequest
3 голосов
/ 05 мая 2011

в Django после агрегирования.
если я использую filter для столбца, который не агрегируется,
Я использую его в предложении where SQL-запроса
, а не в having как и ожидалось.

пример следующий:

У меня есть таблица с результатами теста.Допустим, у меня есть TestA и TestB.

Version:   2    |   2   |   2
TestA   :Pass   |Null   |Fail
testB   :Error  |Fail   |Null

Каждый тест можно запустить в любое время,
Я хочу отобразить последний результат для этого теста.

то, что у меня естьпробовал

x=Site.results.filter(timeEnd__isnull=False).values('idTest').annotate(Max('timeEnd'))

и затем фильтровал x, используя:

x.filter(result=<number of result>)

, но я получаю результаты, используя второй фильтр, который не виден в оригинальном x.

Как я могуполучить желаемый результат?

, но если я пытаюсь отобразить:

result(Version=2).failedFilter()
TestA=Fail
TestB=Fail

result(Version=2).PassedFilter()
TestA=Pass

result(Version=2).ErrorFilter()
TestB=Error

result(version=2)
TestA=Fail
TestB=Fail

, когда на самом деле, кроме фильтра Failed, все остальные должны быть пустыми.

резюме:

tables:
test
----
    id
    name

Site
----
    id
    name

testresult
----------
    id
    date
    testid
    siteid
    result(int)

Я хочу получить последний результат для сайта с каждым тестом, а затем отфильтровать его по результату.

1 Ответ

1 голос
/ 06 мая 2011

latest () вернет самую последнюю модель в наборе запросов.

site = Site.objects.get(id=1)
for test in Test.objects.all():
        test_result = TestResult.objects.filter(site=site, test=test).latest('timeEnd')
        print test_result.result

annotate () просто вычисляет значение, оно не выполняет никакой фильтрации. Я думаю, что ваш текущий запрос вернет все тесты, у которых установлен timeEnd, а не только последний (что, я думаю, вам нужно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...