2013-05-07 6 views
4

У меня уже есть база данных с именем «mydb», где у меня есть таблица под названием «AERODROME».Имена таблиц базы данных с Django

Мой 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_» к имени таблицы, а также что я до сих пор не знаю точно, где именно я фиксирую имя таблицы (и оттуда возникает чувствительная к делу проблема, имеющая «аэродром», а не «AERODROMES»).

Любая помощь здесь?

ответ

9

Используйте Meta класс (documentation here) внутри определения 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 syncdb и python manage.py flush управления таблицей.

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

    class Meta: 
     db_table = 'AERODROMES' 
     managed = False 

С этим вы можете syncdb без страха вытирая данных.

+0

Отлично, спасибо! :) –

+1

Управляется ли это только тем, что таблица была заполнена внешним, или это также означает, что невозможно записать в эту таблицу из приложения? –

+2

Вызов 'Aerodrome.save()' будет работать, как ожидалось, если таблица базы данных фактически дживется с определением модели (например, имеет правильную схему, соответствующую вашим «Name», «Latitude» и «Longitude'). Из [документации] (https://docs.djangoproject.com/en/dev/ref/models/options/#managed): _ «Если False, операции создания или удаления таблицы базы данных не будут выполняться для эта модель ... Это единственное отличие при управлении = False. Все остальные аспекты обработки модели в точности такие же, как и обычные ». _ – pztrick

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' 
1

из Джанго документов: Он настоятельно рекомендуется, что вы используете строчных имен таблиц, когда вы переопределить имя таблицы с помощью db_table, особенно если вы используете бэкэнд MySQL. См. Примечания MySQL для получения дополнительной информации.

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

1

Вы можете установить db table name in models Meta class. как

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, создаются.

Смежные вопросы