Question:
Solve Django save() is not properly saving my object issue

Problem:

I have two models one named Post and the other named Journey. Each Journey contains a query set of Post objects. When I add a post to the posts of Journey and save both the new Post and the Journey, the post does save properly, but the journey doesn't. The Post is being properly created because in my JourneyView it is displayed after it is created but when I refresh the Post no longer appears as part of the journey. I checked the database manually and the new post is saved, and the object does exist; it is just not being saved as part of the Journey.


This is the function I am using to create the 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!...'})


I already tried using a for loop to save all of the journeys that exits:


for journey in Journey.objects.all():

    journey.save()


But again only the post object was being saved and when I refreshed the page the Journey went back to not containing the new post.


Solution: 

Instead of fetching the Journey object, updating it, and then saving it, you can directly use the posts relationship manager of the Journey to add the new post to the list of posts associated with that journey.

journey = Journey.objects.get(id=post.journeyID)

journey.posts.add(post)

journey.save()


journey.posts.add(post) is a concise way of associating the new post with the journey



Suggested blogs:

>Design a basic Mobile App With the Kivy Python Framework

>How React hooks Completely replace redux?

>How to access the state using Redux RTK in the React Native app?

>How to Build a Python GUI Application With WX Python

>How to Build a RESTful API Using Node Express and MongoDB- Part 1

>How to build an Electron application from scratch?

>How to build interactivegraphviz in Python



Nisha Patel

Nisha Patel

Submit
0 Answers