You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:16:13