是否可以使用 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 进行查询,就像您在托管模型中所做的那样。
这个问题不言自明。我有一个数据库,其中我知道有一个名为 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 whenmanaged=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 进行查询,就像您在托管模型中所做的那样。