【问题标题】:Change Session Table Name and Customize Django Session Table更改会话表名称并自定义 Django 会话表
【发布时间】:2020-01-17 03:15:45
【问题描述】:

我的问题:

我正在尝试将 Django 会话表名称从“django_session”更改为其他名称“User_session

我尝试了什么:

from django.contrib.sessions.models import Session
Session._meta.db_table = "my_session"

我将上面的代码放在 Project 的 __init__.py 文件中。但是在初始化会话中间件之前调用会话时出现错误。

我想要什么:

我需要将django_session 表名更改为其他表名并向该表添加几列。尤其是 Django 项目中代码的放置位置(这个更重要)。

注意:

我正在使用Django 2.1.11 and Python 3.7

请帮我解决这个问题。

【问题讨论】:

  • 为什么你需要这样做? session 实现是 Django 内部的,你不应该改变它。
  • 我将解释确切的场景。我有一个数据库,其中已经为不同的应用程序创建了 django_session 表。现在,我们有另一个应用程序,它需要 django_session 里面有额外的字段。现在,我不应该使用现有的 django_session 表,也不应该修改它。我应该为 Session 创建自己的表,并且需要存储和访问 Session 数据

标签: django python-3.x django-sessions


【解决方案1】:

您可以在 python/env 站点包 django/contrib/session/models 中更改会话模型并更改表名

【讨论】:

    【解决方案2】:

    如果您想在会话表中提供自定义名称或创建自定义字段,您可以按照以下步骤操作。

    定义自定义会话后端:

    my_project
        my_project/
            settings.py
            session_backend.py
            ...
        user/
            models.py
            ...
    
    from django.contrib.sessions.backends.db import SessionStore as DBStore
    import user
    
    
    class SessionStore(DBStore):
    
        @classmethod
        def get_model_class(cls):
            return user.models.MySession
    
        def create_model_instance(self, data):
            """
            overriding the function to save the changes to db using `session["user_id"] = user.id` .
            This will create the model instance with the custom field values. 
            When you add more field to the custom session model you have to update the function 
            to handle those fields as well.
            """
            obj = super().create_model_instance(data)
            try:
                user_id = data.get('user_id')
            except (ValueError, TypeError):
                user_id = None
    
            obj.user_id = user_id
            return obj
    

    然后在setting.py 中导入您的自定义类

    SESSION_ENGINE = "my_project.session_backend"
    

    在应用程序的models.py 中定义自定义模型,例如user

    from django.contrib.sessions.models import Session
    
    
    class MySession(Session):
        # you can also add custom field if required like this user column which can be the FK to the user table 
        user = models.ForeignKey('user', on_delete=models.CASCADE) 
    
        class Meta:
            app_label = "user"
            db_table = "my_session"
    

    现在运行以下命令进行迁移

    python manage.py makemigrations
    python manage.py migrate
    

    完成:)

    【讨论】:

    • 未创建自定义会话表。如何告诉 django 在迁移中创建会话表
    • 如果您正确定义模型,然后运行迁移将创建表
    猜你喜欢
    • 2021-05-18
    • 2015-09-25
    • 1970-01-01
    • 2012-06-26
    • 2013-05-05
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多