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

Django模型复制功能修正:复制博文及评论并更新创建时间

修正Django博文复制方法(含关联评论与时间更新)

假设的模型定义

先基于常见结构给出模型代码(若你的模型有特殊字段,可对应调整):

from django.db import models
from django.utils import timezone

class Author(models.Model):
    name = models.CharField(max_length=100)
    # 其他自定义字段

class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='posts')
    date_created = models.DateTimeField(default=timezone.now)
    # 其他自定义字段

class Comment(models.Model):
    post = models.ForeignKey(BlogPost, on_delete=models.CASCADE, related_name='comments')
    content = models.TextField()
    commenter_name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    # 其他自定义字段

修正后的复制方法

将复制逻辑作为BlogPost的实例方法实现,满足复制博文、关联评论并更新创建时间的需求:

class BlogPost(models.Model):
    # 上述模型字段...

    def copy_post_with_comments(self):
        # 构建新博文的字段数据:排除主键和原创建时间
        post_data = {
            field.name: getattr(self, field.name)
            for field in self._meta.fields
            if field.name not in ['id', 'date_created']
        }
        # 创建新博文,手动设置当前时间为date_created
        new_post = BlogPost.objects.create(
            **post_data,
            date_created=timezone.now()
        )

        # 复制所有关联评论
        for comment in self.comments.all():
            comment_data = {
                field.name: getattr(comment, field.name)
                for field in comment._meta.fields
                if field.name not in ['id', 'post']
            }
            # 将评论关联到新博文
            Comment.objects.create(**comment_data, post=new_post)

        # 返回新博文的ID
        return new_post.id

核心要点

  • 避免主键冲突:复制时排除id字段,让Django自动生成新主键
  • 更新创建时间:显式用timezone.now()设置新博文的date_created,确保时区正确
  • 关联评论绑定:复制评论时替换post字段为新创建的博文,保证关联关系正确
  • 灵活适配:若模型有其他不可复制的字段(如唯一约束字段),可在字段排除列表中添加

内容的提问来源于stack exchange,提问作者HesamHashemi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:20:38