Как реорганизовать два набора запросов Django, которые соответствуют - PullRequest
1 голос
/ 05 октября 2019

У меня есть две модели, которые не имеют отношения, я сопоставляю с одним из его полей в этом случае area_ref с resource_ref

Например:

Найдено совпадение: area_ref = 'L020202' с resource_ref = 'L020202'

Моделями ...

class Area(models.Model):
    name = models.CharField()
    area_ref = models.CharField()

    def __str__(self):
        return self.name


class Resource(models.Model):
    name = models.CharField()
    resource_ref = models.CharField()

    def __str__(self):
        return self.name

В настоящее время я делаю это со списками

area = Area.objects.values('area_ref')
area_list_ref = []

for _a in area:
    area_list_ref.append(_a.get('area_ref'))

resource = Resource.objects.filter(resource_ref__in=area_list_ref)

Это работает, но когда находит несколько совпаденийэто занимает много времени

Есть идеи получше?

1 Ответ

3 голосов
/ 05 октября 2019

Вы можете повысить производительность, сделав базу данных index для столбца resource_ref:

class Resource(models.Model):
    name = models.CharField(max_length=128)
    resource_ref = models.CharField(max_length=128<b>, db_index=True</b>)

    def __str__(self):
        return self.name

, это повысит поиск.

Кроме того, мы можем объединитьдва набора запросов и запрос с помощью:

resource = Resource.objects.filter(
    <b>resource_ref__in=Area.objects.values('area_ref')</b>
)

Затем будет выполнен подзапрос для получения элементов, которые должны быть извлечены.

Но, похоже, вы "имитируете" a ForeignKey [Джанго-док] здесь. Похоже, что и Area, и Resource имеют какое-то отношение к "третьей модели". Возможно, было бы лучше ввести отношения, поскольку база данных может проверять ссылочную целостность, и это делает запрос более удобным.

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