如何在Django的另一app中修改CustomUser模型的posts字段数据
Django跨app修改CustomUser的posts字段解决方案
前置配置验证
首先确认项目根目录的settings.py中已经配置了自定义用户模型:
# settings.py AUTH_USER_MODEL = 'users.CustomUser'
这是跨app调用自定义用户模型的必要前提。
具体实现步骤(files app/views.py中)
不需要额外定义外键,你当前的场景是直接操作CustomUser内置的JSON类型posts字段,没有关联独立Post模型的需求,因此无需外键支持,操作流程如下:
- 导入官方推荐的用户模型获取方法,避免硬编码依赖
from django.contrib.auth import get_user_model from django.contrib.auth.decorators import login_required # 操作登录用户数据时用 User = get_user_model()
- 获取需要修改的CustomUser实例,两种常见场景:
- 修改当前登录用户的
posts字段(推荐加登录校验装饰器)
@login_required def your_view(request): current_user = request.user # 后续修改逻辑- 修改指定ID用户的
posts字段
def your_view(request): target_user = User.objects.get(id=用户ID) # 后续修改逻辑 - 修改当前登录用户的
- 修改
posts字段并保存posts是JSONField类型,默认存储字典结构,修改示例如下:
# 新增一条帖子记录,key可设为帖子ID,value存帖子相关信息 new_post_key = "post_001" new_post_value = {"title": "作业提交", "content": "第一周作业", "create_time": "2024-05-20"} # 修改字典字段 current_user.posts[new_post_key] = new_post_value # 强制保存到数据库,指定update_fields可提升更新效率 current_user.save(update_fields=["posts"])
注意事项
如果需要修改posts字典内的嵌套字段值,需要手动标记字段变更,避免Django检测不到修改导致保存失效,示例如下:
# 修改嵌套字段值 current_user.posts["post_001"]["title"] = "修改后的标题" # 标记字段已变更 current_user._meta.get_field("posts").set_attributes_from_value(current_user, current_user.posts) current_user.save(update_fields=["posts"])
如果后续你需要将帖子抽离为独立的Post数据模型,再考虑添加外键关联,示例如下:
# 独立Post模型的外键定义示例 from django.conf import settings from django.db import models class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField() # 外键关联自定义用户模型 author = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="post_set" )
内容的提问来源于stack exchange,提问作者Quintin
相关产品推荐
相关产品推荐

