Django search_fields добавляет DUPLICATE левое внешнее объединение к запросу django, если оно имеет .annotate - PullRequest
0 голосов
/ 24 января 2019

Django search_fields добавляет DUPLICATE левое внешнее соединение с таблицей устройств к запросу Django, так как оно имеет .annotate (devices_count = Count ('devices'))

Просмотр

class AppliancePoolViewSet(VneCommonViewSet):
    serializer_class = vne_serializers.AppliancePoolSerializer
    search_fields = ('pk', 'name', 'notes', 'appliances__name')

    # filter appliance pools by customer
    def get_queryset(self):
        customer = getattr(self.request.user, 'customer', None)
        if not customer:
            return models.AppliancePool.objects.none()
        return models.AppliancePool.objects.filter(
            customer=1).prefetch_related('appliances'
            ).annotate(appliance_count=Count('appliances'))

Сначала этодобавление соединения для аннотации, а затем search_field также добавляет то же соединение снова, поскольку оно имеет поле 'devices__name', что приводит к неверным данным для appliance_count.

Как я могу ограничить добавление дублированного соединения, которое выполняет Djangoфильтры с использованием атрибута search_fields?

1 Ответ

0 голосов
/ 01 марта 2019

Я нашел способ обойти это.Я заменил аннотацию на .extra («Запрос, чтобы получить количество устройств»).Я не использовал join в запросе внутри extra.Таким образом, в конечном запросе есть только одно соединение, но не дублирующее соединение.

...