是否可以使用 Django 的 ORM 查询 table 而无需在模型中为其创建 class?

Is it possible to query a table using Django's ORM without creating a class for it in models?

这个问题不言自明。我有一个数据库,其中我知道有一个名为 Customer 的 table,但 models.py 中不存在。因此,我不能简单地执行以下操作:

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

是否可以编写此查询并获取数据,而无需在 models.py 中为其创建 class 并迁移整个项目?

您需要创建一个 class,但您 不需要 让 Django ORM 通过迁移来管理它。您可以通过添加元选项 managed = False [docs].

来做到这一点

为了节省您的时间和麻烦,Django 提供了一个管理命令 inspectdb [docs],它将为您输出一个 class 定义,包括在数据库中找到的所有字段.

python manage.py inspectdb [table_name]

然后你可以使用它,并设置 meta 选项(不过我相信它默认为 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'

现在您可以导入 class 和 运行:

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

您可以制作托管的模型。您可以通过在模型的 Meta 中指定 managed = False option [Django-doc] 来执行此操作。正如文档中指定的那样:

If False, no database table creation or deletion operations will be performed for this model. This is useful if the model represents an existing table or a database view that has been created by some other means. This is the only difference when managed=False. All other aspects of model handling are exactly the same as normal. (…)

因此您可以在 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 进行查询,就像您在托管模型中所做的那样。