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

Django中save()无法正确关联Post与Journey对象问题求助

问题描述

我有两个模型,分别名为Post和Journey,每个Journey包含一组Post对象查询集。当我将新创建的Post添加到Journey的posts中并保存两者时,Post能正常保存,但Journey的关联无法持久化。创建完成后在JourneyView中能看到该Post,但刷新页面后Post不再属于该Journey。手动查看数据库发现Post已保存,但并未关联到Journey。

以下是用于创建Post的函数:

#Create post
@api_view(['POST'])
def post_create(request):
    form = PostForm(request.POST)
    attachment = None
    attachment_form = AttachmentForm(request.POST, request.FILES)
    #journeys = Journey.objects.filter(created_by_id=request.user.id)
    #journey = Journey.objects.get(id = post.journeyID)


    if attachment_form.is_valid():
        attachment = attachment_form.save(commit=False)
        attachment.created_by = request.user
        attachment.save()

    if form.is_valid():
        post = form.save(commit=False)
        post.created_by = request.user
        post.save()

        journey = Journey.objects.get(id = post.journeyID)
        #journey.posts.set(journey.posts.all())
        journey.save()
        #save_Journey(post.journeyID)

        if attachment:
            post.attachments.add(attachment)

        user = request.user
        user.posts_count = user.posts_count + 1
        user.save()

        serializer = PostSerializer(post)

        return JsonResponse(serializer.data, safe=False)
    else:
        return JsonResponse({'error': 'add somehting here later!...'})

我尝试过遍历所有Journey对象并保存:

for journey in Journey.objects.all():
    journey.save()

但问题依旧,仅Post对象被保存,刷新后Journey仍不包含该新Post。

解决方案

问题核心是你没有真正建立Post和Journey之间的关联。当前代码只是获取了Journey对象并保存,但没有把新建的Post添加到该Journey的关联集合中,或者没有正确设置外键关系。

根据Django中两种常见的关联类型,对应解决方法如下:

1. 多对多关联(Journey模型中定义posts = models.ManyToManyField(Post))

在获取目标Journey对象后,调用add()方法将新建的Post加入关联集合:

if form.is_valid():
    post = form.save(commit=False)
    post.created_by = request.user
    post.save()

    journey = Journey.objects.get(id=post.journeyID)
    journey.posts.add(post)  # 关键:添加Post到Journey的关联集合
    journey.save()

2. 外键关联(Post模型中定义journey = models.ForeignKey(Journey, on_delete=models.CASCADE, ...))

这种情况下,应该在保存Post之前就设置好外键,无需单独操作Journey:

if form.is_valid():
    post = form.save(commit=False)
    post.created_by = request.user
    # 直接设置Post的外键关联到目标Journey
    post.journey = Journey.objects.get(id=request.POST.get('journey_id'))
    post.save()

额外注意事项

  • 确认Post模型中的关联字段名称是否正确,比如如果是外键,字段名应为journey而非journeyID,避免表单提交或代码中的字段名混淆
  • 如果journeyID是表单提交的字段,建议直接从request.POST中获取,比如request.POST.get('journey_id'),而不是依赖post.journeyID(可能存在未赋值的情况)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:42:35