我很难创建数据迁移.我为我的应用程序使用两个数据库.我在settings.py中配置了数据库,并在Django docs中创建了一个路由器.
# settings.py
DB_HOST = 'localhost'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'helios',
'HOST': DB_HOST,
'OPTIONS': {
'read_default_file': join(dirname(__file__), 'default.cnf'),
},
},
'other': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'gala_pol',
'HOST': DB_HOST,
'OPTIONS': {
'read_default_file': join(dirname(__file__), 'other.cnf'),
},
},
DATABASE_APPS_MAPPING = {
'contenttypes': 'default',
'auth': 'default',
'admin': 'default',
'sessions': 'default',
'messages': 'default',
'staticfiles': 'default',
'woodsmen': 'default',
'helios': 'default',
'hush': 'default',
'hunt': 'other',
'meat': 'other',
'beast': 'other',
}
# routers.py
class DatabaseAppsRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label in …Run Code Online (Sandbox Code Playgroud) 我刚刚创建了一个代理模型,并且惊讶于manage.py makemigrations创建了一个带有migrations.CreateModel操作的新迁移文件.
代理模型不会创建新的数据库表,它只是同一数据集的不同python接口,并且实际上不manage.py sqlmigrate my_app_label 0042返回任何内容.
我认为它可能用于创建代理模型,ContentType但如果它们不存在则按需创建.
它是否用于触发代理模型权限的创建?代理模型权限有一个6岁的开放式bug,所以我不确定这个部分应该如何工作...
它用来Django 1.8测试这个.
编辑:澄清一下,Django创建一个对新代理模型没有任何作用的迁移,所以Django如果它没有用,我们不想在第一时间创建迁移吗?
是否存在迁移有用的用例?
我正在尝试移植我的项目以使用Django 1.7.一切都很好,除了一件事.测试文件夹内的模型.
Django 1.7新迁移在内部运行migrate命令.在syncdb运行之前.这意味着如果模型未包含在迁移中 - 它将不会填充到DB(以及测试数据库).这正是我现在所经历的.
我所做的是:
在我的/app/tests/models.py虚拟模型中:class TestBaseImage(BaseImage): pass
它所做的只是从抽象 BaseImage模型继承.
然后在测试中我创建该虚拟模型的实例来测试它.
问题是它不再起作用了.它不包含在迁移中(这很明显,因为我不想将我的测试模型保存在生产数据库中).运行我的测试会导致DB错误table does not exist.这是有道理的,因为它不包含在迁移中.
有没有办法让它适用于新的迁移系统?我找不到一种"修复"的方法.
我使用的代码:
应用程序/测试/ models.py
from ..models import BaseImage
class TestBaseImage(BaseImage):
"""Dummy model just to test BaseImage abstract class"""
pass
Run Code Online (Sandbox Code Playgroud)
应用程序/ models.py
class BaseImage(models.Model):
# ... fields ...
class Meta:
abstract = True
Run Code Online (Sandbox Code Playgroud)
工厂:
class BaseImageFactory(factory.django.DjangoModelFactory):
"""Factory class for Vessel model"""
FACTORY_FOR = BaseImage
ABSTRACT_FACTORY = True
class PortImageFactory(BaseImageFactory):
FACTORY_FOR = PortImage
Run Code Online (Sandbox Code Playgroud)
示例测试:
def get_model_field(model, field_name):
"""Returns …Run Code Online (Sandbox Code Playgroud) 在Django 1.7之前,当使用Django Sites Framework时,可以/应该使用Initial Fixtures定义初始数据.
的myproject /装置/ initial_data.json
Run Code Online (Sandbox Code Playgroud)[ { "pk": 1, "model": "sites.site", "fields": { "domain": "domain1", "name": "name1" } }, { "pk": 2, "model": "sites.site", "fields": { "domain": "domain2", "name": "name2" } }, { "pk": 3, "model": "sites.site", "fields": { "domain": "domain3", "name": "name3" } } ]
由于它是一个全局项目设置,我在项目根目录中添加了一个"fixtures"文件夹,并将其添加到FIXTURE_DIRS.
# Used to search fixture files directories.
# Fixture files are files that provide initial data to be
# inserted in the database. (>python manage.py loaddata) …Run Code Online (Sandbox Code Playgroud) 我想知道什么是使用Django迁移删除所删除应用程序的所有表的最简洁方法.例如,如果我安装了一个新软件包,我将应用程序添加到我的settings.py中,然后执行manage.py makemigrations和manage.py migrate; 当我决定我不想使用这个包并将其从我的settings.py中删除时,命令manage.py makemigrations将告诉我"未检测到任何更改",因此manage.py migrate将无能为力,但我需要删除此删除的应用程序创建的表.
我期望Django迁移处理这个,所以如果我删除一个应用程序,它也会创建迁移以删除所有必要的表.
我想在手动编写的迁移中添加一些组并为其分配权限,但如果我在干净的DB上运行它,则只有在运行所有迁移后才会创建权限.
我找到了这张票:https: //code.djangoproject.com/ticket/23422但我不能在那里发表评论(我可能会在表达对GeoDjango文档的不满之后被禁止),所以我将分享对解决方案的改进在下面.
我试图使用migrations.RunSQLDjango迁移来运行一些任意的SQL代码.我想仅针对某些db后端运行此迁移(例如仅针对postgres).
我想使用这样的东西,但我没有看到类中的数据库连接信息Migration.
有两个模型组和学生,只有一个表的组,学生表被删除.
如何maje Django再次创建它?如果我做了数字,它会打印"未检测到任何变化".
在管理页面上,当我单击Students表时,它会抛出异常:
relation "students_students" does not exist
Run Code Online (Sandbox Code Playgroud) 这是我的models.py:
class Notification(models.Model):
user = models.ForeignKey(User)
createdAt = models.DateTimeField(auto_now_add=True, blank=True)
read = models.BooleanField(default=False, blank=True)
class Meta:
abstract = True
class RegularNotification(Notification):
message = models.CharField(max_length=150)
link = models.CharField(max_length=100)
class FNotification(Notification):
# same as Notification
pass
Run Code Online (Sandbox Code Playgroud)
当我这样做时python manage.py makemigrations,这就是它所说的:
Migrations for 'CApp':
0019_auto_20151202_2228.py:
- Create model RegularNotification
- Create model FNotification
- Remove field user from notification
- Add field f_request to userextended
- Delete model Notification
Run Code Online (Sandbox Code Playgroud)
首先,它说的很奇怪,Remove field user from notification因为user它仍然在我的Notiication模型中(因此,如果有人能够弄清楚为什么它说"从通知中删除现场用户",那就太好了!)但是,当我继续前进并尝试时做python manage.py …
我不知道是什么导致了这个错误.它似乎是一个没有修复的错误.任何人都可以告诉我如何解决这个问题吗?令我感到沮丧的是,我永无止境.谢谢.
Operations to perform:
Apply all migrations: admin, contenttypes, optilab, auth, sessions
Running migrations:
Rendering model states... DONE
Applying optilab.0006_auto_20160621_1640...Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 353, in execute_from_command_line
utility.execute()
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 345, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 399, in execute
output = self.handle(*args, **options)
File "C:\Python27\lib\site-packages\django\core\management\commands\migrate.py", line 200, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
File "C:\Python27\lib\site-packages\django\db\migrations\executor.py", line 92, in migrate
self._migrate_all_forwards(plan, …Run Code Online (Sandbox Code Playgroud)