Предварительная выборка диапазонов дат дает несколько записей вместо 1 - PullRequest
0 голосов
/ 20 декабря 2018

Следующее возвращает 3 объекта, но это должно быть только 1. Поскольку существует только 1 объект InsiderTrading, у которого есть эти фильтры, но есть 3 владельца.

quarter_trading_2018q1 = InsiderTrading.objects.filter(
    issuer=company_issuer.pk,
    owners__company=company.pk,
    transaction_date__range=["2018-01-01", "2018-03-30"]
).prefetch_related('owners')

enter image description here

Если я, однако, удаляю фильтр owner_company, он возвращает 1 (правильное поведение)

quarter_trading_2018q1 = InsiderTrading.objects.filter(
    issuer=company_issuer.pk,
    transaction_date__range=["2018-01-01", "2018-03-30"]
).prefetch_related('owners')

enter image description here

Но я все еще хочуОтфильтровать по Owners_company, как мне тогда вернуть 1?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Если distinct работает: это означает, что этот запрос приводит к

InsiderTrading.objects.filter(
    issuer=company_issuer.pk,
    owners__company=company.pk,
    transaction_date__range=["2018-01-01", "2018-03-30"]
)

с несколькими результатами, а не одним.

Состояния документов Django

select_related() «следует» отношениям внешнего ключа, выбирая дополнительные данные связанного объекта при выполнении своего запроса.

prefetch_related () выполняет отдельный поиск для каждого отношения и выполняет «соединение» в Python.

Я бы сказал, вместо этого используйте select_related.check https://stackoverflow.com/a/31237071/4117381

Другое решение - использовать group_by owner_id.

0 голосов
/ 20 декабря 2018

Вы должны добавить Different () .

InsiderTrading.objects.filter(
    issuer=company_issuer.pk,
    owners__company=company.pk,
    transaction_date__range=["2018-01-01", "2018-03-30"]
).distinct().prefetch_related('owners')
...