Django не создает таблицы БД для моделей (ни с syncdb, ни с South)

У меня есть проект Django на Centos VPS.

Я создал несколько моделей и отладил их, чтобы они проверялись и не выдавали ошибок. У меня они есть в папке «модели» в моем приложении, и я добавил каждую модель в файл инициализации в этом каталоге, например:

из категории импорт Категория

Я добавил приложение в settings.py INSTALLED_APPS и запустил:

Python manage.py syncdb

Оказалось, что он работает нормально и добавил все таблицы, кроме таблиц для моего приложения.

Затем я установил South и добавил его в INSTALLED_APPS, снова попробовал syncdb и запустил:

Python manage.py schemamigration myapp --initial

Он правильно сгенерировал файл, но в нем ничего не было (ни одной из таблиц моих моделей).

Пример файла в папке "models" (usertype.py)

from django.db import models

class UserType(models.Model):
    usertype_id = models.PositiveIntegerField(primary_key=True)
    description = models.CharField(max_length=100)
    is_admin = models.BooleanField()
    is_moderator = models.BooleanField()

class Meta:
    app_label = 'myapp'

Любые идеи, что здесь может пойти не так и почему я не могу ничего обнаружить для своих моделей?


person user3227889    schedule 23.01.2014    source источник
comment
Пожалуйста, отредактируйте исходное сообщение и добавьте свой комментарий как его часть, это нечитабельно   -  person yuvi    schedule 23.01.2014
comment
Я добавил это в исходный пост сейчас, нужна ли дополнительная информация?   -  person user3227889    schedule 23.01.2014
comment
Смотрите мой другой комментарий, пожалуйста   -  person yuvi    schedule 23.01.2014
comment
Пожалуйста, смотрите мое редактирование для обновленного решения.   -  person yuvi    schedule 25.01.2014


Ответы (2)


Выполните следующие команды

python manage.py makemigrations yourappname

python manage.py migrate

Примечание, у меня это работает на версии django 1.7.

person Rafiq    schedule 29.11.2014

вы неправильно понимаете процесс работы с югом. South — это не просто еще одно приложение, это инструмент управления. Ваше приложение должно быть приложением South с самого начала или преобразовано в него. При этом процесс выглядит так:

  1. Добавить Юг в INSTALLED_APPS
  2. запустить syncdb в первый раз
  3. Добавьте свое приложение в INSTALLED_APPS*
  4. запустите южную команду инициализации:

    python manage.py schemamigration myapp --initial
    
  5. мигрировать:

    python manage.py migrate
    

Если вы хотите преобразовать проект:

  1. Запустите syncdb после добавления юга
  2. бегать:

    manage.py convert_to_south myapp

И с этого момента используйте юг для управления миграциями.

*p.s. - вы можете добавить одновременно юг и свое собственное приложение, если вы не забываете поставить юг перед своими собственными приложениями. Это потому, что django читает INSTALLED_APPS по порядку — он запускает syncdb для всех приложений, но после установки юга не устанавливает остальные и вместо этого говорит вам использовать команды юга для обработки этих приложений.

изменить

Я ввел вас в заблуждение. Поскольку вы так много внимания уделяете югу, я не понял, что проблема заключалась в том, что вы пытались использовать модели в качестве модуля каталога вместо обычного файла. Это признанная проблема в django, и обходной путь на самом деле точно такой же, как и вы. :

скажем, это ваша структура:

project/
       myapp/
            models/
                  __init__.py
                  bar.py

вам нужно, чтобы bar.py выглядело так:

from django.db import models

class Foo(models.Model):
    # fields...

    class Meta:
        app_label = 'myapp' #you need this!

и __init__.py должен выглядеть так:

from bar import Foo

Убедитесь, что это выглядит так, и это будет работать.

ОБНОВЛЕНИЕ 18 августа 2014 г.

Билет был изменен на wontfix, потому что, очевидно, более серьезная проблема с app_label исправлено. Ура!

person yuvi    schedule 23.01.2014
comment
Я использую --initial, потому что это новое приложение без моделей в БД. Я попробовал manage.py convert_to_south myapp, просто чтобы посмотреть, что произошло, и он сказал, что в этом приложении нет моделей; эта команда предназначена для приложений, в которых уже есть модели, синхронизированные с базой данных. Создайте несколько моделей, а затем используйте ./manage.py schemamigration myapp --initial вместо этого. Как уже упоминалось, я могу запустить --initial, и он выполняется, как и ожидалось, за исключением того факта, что в сгенерированном файле ничего нет, он не обнаруживает ни одну из моделей. Это новые модели, ни одна из которых не находится в БД. - person user3227889; 23.01.2014
comment
1. То, как вы описали это в своем посте, не так, как я описал это 2. Можете ли вы поделиться моделями.py? Также любая дополнительная информация, которую вы считаете уместной. Я не думаю, что вижу всю проблему еще - person yuvi; 23.01.2014
comment
Теперь я удалил ссылки из __init__.py в папке моделей в соответствии с вашей рекомендацией. Спасибо за это, хотя это не изменило мою проблему, как указано, без обнаружения моделей. - person user3227889; 23.01.2014
comment
Я не ожидал, что это что-то изменит, я просто упомянул об этом. - person yuvi; 23.01.2014
comment
Круто, я сейчас добавил пример одной из моделей в описание вопроса выше. - person user3227889; 23.01.2014
comment
Хорошо - глядя на вашу модель, все кажется в порядке. Вот в чем дело. Если вы еще не запускали syncdb на юге, приложение не является южным приложением. Следовательно, он определенно должен создавать таблицы для вашего models.py. Так что проблема скорее всего не в юге, а в чем-то другом. Вы уверены, что правильно указали имя приложения в файле install_apps? Кроме того, почему вы устанавливаете свой app_label? Вам не нужно этого делать, если вы не хотите, чтобы это было по-другому - person yuvi; 23.01.2014
comment
Да syncdb (без Юга) тоже не работает, как упоминалось. В INSTALLED_APPS у меня просто есть «myapp», где myapp/models — это относительный путь (откуда находятся manage.py и settings.py) к моим моделям. Я думал, что app_label нужен, но, возможно, нет, поэтому я его уберу. - person user3227889; 23.01.2014
comment
это не нужно, но даже в этом случае я создал новое тестовое приложение, и с ним все работало нормально. Я понятия не имею, что ты делаешь не так, но это не имеет никакого отношения к югу. - person yuvi; 23.01.2014
comment
Возможно, это потому, что я неправильно установил Django. Я использую системную версию Python, так как мне не удалось установить Django в моей альтернативной установке более поздней версии Python. Однако, когда я пытаюсь создать новый проект django-admin.py startproject mytestapp, я получаю -bash: django-admin.py: command not found. Я установил Django с помощью yum install Django - person user3227889; 23.01.2014
comment
Это, вероятно, проблема. Попробуйте новую установку внутри изолированного виртуального окружения, это может помочь. - person yuvi; 23.01.2014
comment
Мне удалось сделать новый проект (он просто нуждался в django-admin startproject mytestapp - без .py). У меня такая же проблема со свежим проектом - person user3227889; 24.01.2014
comment
Джанго. Попробуйте переустановить джанго - person yuvi; 24.01.2014
comment
Я только что сделал установку Django 1.6.1, которая заменила 1.4.8 для версии системы Python, которую я использую (2.6). Это не решило проблему. - person user3227889; 24.01.2014
comment
Я действительно не могу понять, в чем проблема, без дополнительной информации. Я могу сказать вам, что это не связано с югом и, вероятно, связано с вашей установкой. Я предлагаю вам использовать virtualenv, который создает изолированную версию python и pip. Устанавливайте там все с нуля, возможно у вас что-то не так с системными сайт-пакетами... - person yuvi; 24.01.2014
comment
Я следовал некоторым онлайн-инструкциям, чтобы попытаться сделать это (установите последнюю версию Python с помощью altinstall и создайте virtualenv). Я получил несколько ошибок по пути, но продолжил. К сожалению, попытка sudo python virtualenvwrapper-4.2/setup.py только что получила distutils.errors.DistutilsFileError: The setup.cfg file /usr/local/bin/Python-3.3.3/setup.cfg does not exist. - person user3227889; 24.01.2014
comment
Я раскрутил новый VPS и сделал все с нуля, но у меня все та же проблема!!! - person user3227889; 24.01.2014
comment
Я понятия не имею. Прости. - person yuvi; 24.01.2014
comment
Итак, проблема в том, что он не подбирает модели, когда они находятся в папке «модели»! есть идеи, почему? - person user3227889; 24.01.2014
comment
Я только что сдался и оставил все модели в файле models.py, потому что это слишком хлопотно - в любом случае спасибо за помощь. - person user3227889; 24.01.2014
comment
Извините, я ввел вас в заблуждение. Я не заметил, что проблема заключалась в попытке использовать модели в качестве папки. Ваша первоначальная мысль была правильной, хотя вы, вероятно, сделали что-то не так. Редактирование моего ответа теперь включает проверенное рабочее решение. Убедитесь, что это выглядит так, и все будет работать - person yuvi; 25.01.2014