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
相关产品推荐
相关产品推荐

