给Mezzanine 4.2.3项目添加第三方数据库时出现django_site表不存在错误
解决Django 1.10.8 + Mezzanine 4.2.3多数据库场景下
django_site表不存在的问题 嘿,我之前在多数据库的Django项目里踩过类似的坑,结合你用的Django和Mezzanine版本,给你几个针对性的排查和解决步骤:
1. 确认多数据库路由规则是否覆盖了sites应用
因为你给food_crud配置了第三方数据库,但django_site是django.contrib.sites的表,默认情况下Django只会把它迁移到默认数据库。如果你的food_crud应用需要访问这个表,就得通过路由规则指定它该用哪个数据库。
在项目里创建一个路由类(比如routers.py),示例代码如下:
class FoodCRUDRouter: def db_for_read(self, model, **hints): # 指定food_crud的模型用food_db数据库 if model._meta.app_label == 'food_crud': return 'food_db' # 如果food_crud需要读取django_site,也要指定对应的数据库 elif model._meta.app_label == 'sites': return 'food_db' # 要是site表在默认数据库,就换成'default' return None def db_for_write(self, model, **hints): if model._meta.app_label == 'food_crud': return 'food_db' elif model._meta.app_label == 'sites': return 'food_db' return None def allow_migrate(self, db, app_label, model_name=None, **hints): # 允许food_crud的迁移在food_db执行 if app_label == 'food_crud': return db == 'food_db' # 允许sites的迁移在food_db执行(确保表创建在目标库) elif app_label == 'sites': return db == 'food_db' return None
然后在settings.py里添加这个路由:
DATABASE_ROUTERS = ['your_project_name.routers.FoodCRUDRouter']
记得把your_project_name换成你实际的项目名,food_db换成你配置的第三方数据库别名。
2. 手动给目标数据库迁移sites应用
之前你执行migrate的时候可能没指定数据库,导致sites的表只在默认数据库(比如SQLite)里创建,而你的food_crud用的第三方数据库里根本没有这个表。现在手动指定数据库执行sites的迁移:
python manage.py migrate sites --database=food_db
这里的food_db同样要替换成你实际的数据库别名。
3. 确保目标数据库里存在对应的Site记录
Mezzanine依赖django.contrib.sites,必须要有一条对应SITE_ID的记录。你可以通过指定数据库的Shell来创建:
python manage.py shell --database=food_db
进入Shell后执行:
from django.contrib.sites.models import Site # 这里的id要和settings.py里的SITE_ID一致,默认是1 Site.objects.get_or_create(id=1, defaults={'domain': 'your-domain.com', 'name': 'Your Site Name'})
然后检查settings.py里的SITE_ID是否是你创建的这条记录的ID。
4. 按正确顺序执行迁移命令
先迁移sites到目标数据库,再处理food_crud的迁移,避免依赖问题:
# 先迁移sites到第三方数据库 python manage.py migrate sites --database=food_db # 生成food_crud的迁移文件 python manage.py makemigrations food_crud # 迁移food_crud到第三方数据库 python manage.py migrate food_crud --database=food_db
按照这个流程走下来,应该就能解决no such table: django_site的错误了。
内容的提问来源于stack exchange,提问作者nusantara
相关产品推荐
相关产品推荐

