15

我已经有一个名为“mydb”的数据库,其中有一个名为“AERODROME”的表。

我的 models.py 看起来像这样:

from django.db import models

class Aerodrome(models.Model):
    Name = models.CharField(max_length=48)
    Latitude = models.DecimalField(decimal_places=4, max_digits=7)
    Longitude = models.DecimalField(decimal_places=4, max_digits=7)

我在views.py有这个方法:

from django.shortcuts import render
from helloworld.models import Aerodrome

def aerodromes(request):
    return render(request, 'aerodromes.html', {'aerodromes': Aerodrome.objects.all()})

在我的模板文件夹中,我有 aerodromes.html,这也很简单:

<!doctype html>
<html>
    <head>
    </head>
    <body>
        <table>
        {% for aerodrome in aerodromes %}
            <tr>
                <td>{{ aerodrome.Name }}</td>
                <td>{{ aerodrome.Longitude }}</td>
                <td>{{ aerodrome.Latitude }}</td>
            </tr>
            {% endfor %}
        </table>
    </body>
</html>

当我通过浏览器进行测试时,我收到一个错误,因为它看起来像是在使用错误的名称访问表。我的应用程序被称为“helloworld”,因为它是一个测试,而不是访问 mydb.AERODROMES,而是访问 mydb.helloworld_aerodrome(还要注意区分大小写的问题)。

由于我已经填充了数据库,因此我没有运行 syncdb(我知道这不是必需的,但也许这就是问题所在)。

所以,问题是我不知道为什么要在表名中添加“helloworld_”,而且我仍然不确定我在哪里修复表名(从那里开始区分大小写有“aerodrome”而不是“AERODROMES”的问题)。

这里有什么帮助吗?

4

4 回答 4

39

在模型定义中使用Meta类(此处的文档) :models.py

class Aerodrome(models.Model):
    Name = models.CharField(max_length=48)
    Latitude = models.DecimalField(decimal_places=4, max_digits=7)
    Longitude = models.DecimalField(decimal_places=4, max_digits=7)

    class Meta:
        db_table = 'AERODROMES'

这将覆盖 SQL 数据库中模型表的默认命名方案。


您还可以添加managed属性来控制python manage.py syncdbpython manage.py flush管理表格。

class Aerodrome(models.Model):
    # ...

    class Meta:
        db_table = 'AERODROMES'
        managed = False

有了这个,你可以syncdb不用担心擦除你的数据。

于 2013-05-07T14:30:25.300 回答
3

来自 django 文档:强烈建议您在通过 db_table 覆盖表名时使用小写表名,特别是在使用 MySQL 后端时。有关更多详细信息,请参阅 MySQL 说明。

https://docs.djangoproject.com/en/1.11/ref/databases/#table-names

于 2013-05-07T14:32:16.887 回答
1

为您的模型明确指定表名应该会有所帮助:

from django.db import models

class Aerodrome(models.Model):
    Name = models.CharField(max_length=48)
    Latitude = models.DecimalField(decimal_places=4, max_digits=7)
    Longitude = models.DecimalField(decimal_places=4, max_digits=7)

    class Meta:
        db_table = 'AERODROMES'
于 2013-05-07T14:30:25.727 回答
1

您可以在模型类中设置db 表名Meta。作为

class Aerodrome(models.Model):
    Name = models.CharField(max_length=48)
    Latitude = models.DecimalField(decimal_places=4, max_digits=7)
    Longitude = models.DecimalField(decimal_places=4, max_digits=7)

    class Meta:
        db_table="AERODROMES"

如果您在外部预填充表。注意数据在每个记录/字段中是适当的/兼容的。

但是,您必须syncdb创建 django 所需的其他表。

于 2013-05-07T14:33:27.927 回答