Можно ли запросить таблицу, используя ORM Django, не создавая для нее класс в моделях? - PullRequest
2 голосов
/ 22 февраля 2020

Вопрос довольно очевиден. У меня есть база данных, где я знаю, что есть таблица с именем Customer, но ее нет в models.py. Поэтому я не могу просто сделать следующее:

customers = Customer.objects.filter(age__gte=25)

Можно ли написать этот запрос и получить данные, не создавая для него класс в models.py и не перенеся весь проект?

Ответы [ 2 ]

3 голосов
/ 22 февраля 2020

Вам нужно создать класс, но вы не должны позволить Django ORM управлять им посредством миграций. Вы можете сделать это, добавив мета-опцию managed = False [ документы ].

Чтобы сэкономить время и головные боли, Django предлагает команду управления inspectdb [ документы ], который выведет определение класса для вас, включая все поля, найденные в базе данных.

python manage.py inspectdb [table_name]

Затем вы можете использовать это и установить мета-опцию (I верю, что по умолчанию managed = False, хотя). Это будет выглядеть примерно так:

class Customer(models.Model):
    id = models.IntegerField(db_column='ID', primary_key=True)  # Field name made lowercase.
    age = models.IntegerField(...)
    name = models.CharField(...)
    date_joined = models.DateField(...)

    class Meta:
        managed = False
        db_table = 'someTableName'

Теперь вы можете импортировать класс и запустить:

customers = Customer.objects.filter(age__gte=25)
2 голосов
/ 22 февраля 2020

Вы можете создавать модели, которые не управляются. Это можно сделать, указав managed = False параметр [Django -doc] в Meta вашей модели. Как указано в документации:

Если False, , то операции по созданию или удалению таблицы базы данных не будут выполняться для этой модели. Это полезно, если модель представляет существующую таблицу или представление базы данных, созданное другими способами. Это единственная разница, когда managed=False. Все остальные аспекты работы с моделью в точности совпадают с обычными. (…)

Таким образом, вы можете создать модель в своем models.py:

# app/models.py

from django.db import models

class Customer(models.Model):
    age = models.IntegerField()

    class Meta:
        <b>managed = False</b>
        db_table = 'Customer'

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

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