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

Django实现用户注册时复制通用任务模型至用户独立任务集

解决方案:用关联模型实现用户独立任务集

不用给每个用户单独创建模型,只需要新增一个绑定用户和全局任务的关联模型,就能让每个用户拥有独立的任务状态跟踪。

1. 先优化原任务模板模型(可选)

原applib是管理员维护的全局任务模板,建议把原status改名为default_status,避免和用户的专属任务状态混淆:

from django.db import models

# 类名改用大驼峰,符合Django规范
class AppLib(models.Model):
    STATUS_CHOICES = [
        ('C', 'Completed'),
        ('P', 'Pending'),
    ]
    title = models.CharField(max_length=50)
    # 全局任务的初始默认状态
    default_status = models.CharField(max_length=2, choices=STATUS_CHOICES, default='P')
    point = models.IntegerField()
    category = models.CharField(max_length=50)
    subcat = models.CharField(max_length=50)
    applink = models.CharField(max_length=100)

    def __str__(self):
        return self.title

2. 新增用户任务关联模型

这个模型专门存储每个用户对任务的独立状态,绑定用户和全局任务模板:

from django.contrib.auth.models import User
from django.db import models

class UserTask(models.Model):
    STATUS_CHOICES = [
        ('C', 'Completed'),
        ('P', 'Pending'),
    ]
    # 关联到当前用户
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_tasks')
    # 关联到全局任务模板
    task_template = models.ForeignKey(AppLib, on_delete=models.CASCADE, related_name='assigned_tasks')
    # 用户自己的任务状态
    status = models.CharField(max_length=2, choices=STATUS_CHOICES)
    # 可额外添加用户专属字段,比如完成时间
    completed_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        # 确保一个用户对同一个全局任务只有一条记录
        unique_together = ['user', 'task_template']

    def __str__(self):
        return f"{self.user.username} - {self.task_template.title}"

3. 用户注册时自动生成任务集

当新用户注册成功后,自动给用户创建所有全局任务的专属记录,推荐用Django信号实现:

第一步:写信号处理逻辑

在你的app下新建signals.py:

from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import AppLib, UserTask

# 用户创建完成后触发
@receiver(post_save, sender=User)
def create_user_tasks(sender, instance, created, **kwargs):
    if created:
        # 获取所有管理员创建的全局任务
        all_tasks = AppLib.objects.all()
        # 批量生成用户的专属任务记录
        user_task_list = [
            UserTask(
                user=instance,
                task_template=task,
                status=task.default_status  # 沿用全局任务的默认状态
            ) for task in all_tasks
        ]
        UserTask.objects.bulk_create(user_task_list)

第二步:注册信号

在app的apps.py里添加信号注册:

from django.apps import AppConfig

class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = '你的app名称'

    def ready(self):
        import 你的app名称.signals

如果是自定义注册视图,也可以直接在视图里写创建逻辑,效果一样。

4. 访问用户的独立任务

在视图或模板里,通过用户实例的关联字段直接获取:

# 视图中获取当前登录用户的任务
user_tasks = request.user.user_tasks.all()

模板里渲染:

{% for task in user.user_tasks.all %}
    <p>任务:{{ task.task_template.title }} | 状态:{{ task.get_status_display }}</p>
{% endfor %}

核心逻辑说明

  • AppLib只负责存储所有用户共享的任务基础信息,管理员修改后所有用户的任务模板信息会自动同步
  • UserTask是每个用户的任务实例,单独存储用户的任务状态,互不干扰
  • 这种方式既不用重复创建模型,又能完美实现“用户独立跟踪任务”的需求

内容的提问来源于stack exchange,提问作者Hemant Kumar Chaudhary

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:40:38