+ 7
[Semi-Solved] How would I go about making an effective chained comment feature?
I am working on a project that mimics a social network. I am having trouble with coming up with a way to make comments that can be chained, for example, have a comment that has it's own set of comments. My initial thinking was to have the Comment model take a reference of it's self but I am not sure if that would be such a great practice. And even if I were to do that, would that not mean when I called the API from javascript for the comments that I'd have to keep making a bunch of calls to get a specific comment and it's children and/or parent? I have linked the current model for my comment and I'm definitely open to any changes to it. https://code.sololearn.com/cRns9xB739Vd/?ref=app
36 Réponses
+ 6
This kind of feature is actually out of my grasp currently when it comes to the level I am in computer science wise. As The Cereal Killer brought out, an implementation would require a data structure called Trees which I have not done enough research on and practice with.
And if anyone would like to see a free course that would go over them: https://www.coursera.org/learn/algorithms-graphs-data-structures
Beware, it has a lot of prerequisites though. Even myself won't be getting to it for a while but it's definitely getting done.
I'll just mark this answer as complete so it'll be at the top and be sure to look at the resources TCK gave as well.
+ 5
The Cereal Killer Thank you so much, I really appreciate it! I was actually hoping you'd see my question LOL Definitely going to take a look at that book.
+ 4
The Cereal Killer Just as you posted this answer, I was doing some research and came across that package but it's not maintained so I'm little worried about using it. I'll still give it a deeper look though.
And I'm in the middle of seeing which course in OSSU has a better explaination of trees as well so I can get a better understanding of that before I implement it blindly.
And NoSQL has been something that has piqued my interest but for now, I wanna stick with Django since I am still quite a beginner in web development as a whole and don't wanna switch around to fast. But that's definitely good to know!
+ 4
Not to me, haha. It was a force of habit but I'll take it out just incase you aren't to others LOL
+ 2
Mirielle you're right. I deleted my post after posting it realizing it was probably not right, even before you replied.
My bad. I was thinking of another thing....😅 I was thinking trees and traversing them to quickly find stuff.
But I see that it is not really about traversing but more of a data model problem and how to daisy chain comments for easy access.
Maybe something like adding
comment = models.ForeignKey('self',
on_delete=models.CASCADE,
related_name"comment_reply")
to the Comment class? Then comments can have comments.
This could just be a link that the user may or may not click to display the comment_reply. Of course you might have to put a limit on how deep it goes.
you reply reminded me of this.🫣
https://news.ycombinator.com/item?id=25025061
ok. graphql is not a magic bullet. Point noted. You win...😅
+ 2
Bob_Li I got a suggestion to do similar from one of the director's at OSSU to also create a nullable parent, but I am still not understanding how I would also effectively call that API in my JS to display it properly, that I'm just going to hold off. I know it's going to require some recurrsion and stuff but I've really rather not touch it till I get a proper grasp on the subject.
I'm an overpreparer for stuff and even this entire project is just to prepare me for another personal project that I super-duper want to work on LOL
+ 1
Justice how about doing a simple mockup to see how it works?
Too bad you can't do Django in Sololearn, but a simple Django project shouldn't be too hard to set up.
to create links, maybe something like this
https://stackoverflow.com/questions/69601233/how-can-i-link-a-comment-to-its-corresponding-post-in-django
or maybe a slug field using unique_for_date for urls.
+ 1
Mirielle Perfect questions especially since I'm doing a notifications feature.
+ 1
Mirielle Justice
If you think about it you do get a tree like structure
class Comment(models.Model):
... # comment fields
parent = models.ForeignKey('self', on_delete=models.CASCADE, related_name='children')
When someone replies to your comment they take your comment as a parent node
w = Comment(..., parent=H)
We could define our simple notification model like so
class Notification(models.Model):
field_id = models.PositiveIntegerField()
message = models.TextField()
we call our notification like so
n = Notification(field_id=w.id, message="Someone replied to your comment")
The notification contains comment (W)s id so if we wanted to direct our users straight to comment W we could create a route thag takes a comment id as a parameter
eg https://example.com/post/comments/id
+ 1
Mirielle The ForeignKey is a many-to-one relationship, so there will be branching and thus a treelike structure, I suppose.
+ 1
Mirielle I get what you are saying, lets forget about django and databases for now and view it in this manner
- A post is created
- Comment W is added
- 4 people A B C and D reply to comment W directly
considering these 4 people can all reference W as their parent so we have a dynamic structure with no limit as to how many child nodes a parent can have
struct Comment {
nodes{}
}
w = {
... # other fields
nodes {
A,B,C,D
}
}
a could know about the other nodes by calling
A.parent.nodes which returns A,B,C,D
W knows about all its children by calling
W.nodes
Lets say W has a Parent X
it could know about W's children by calling
X.nodes('w').nodes
So in the end you can do many relational queries enabling you to interact with another comments nodes
+ 1
Mirielle To be able to get something like (ab) replied to (comment) on post(x) you can use signals to be triggered when a Comment is created
+ 1
Anonymous Ah, I'm not using Node.js so that's not going to help in my case. Everything is Vanilla JS so I can get more familiar with it. I'm also having trouble figuring out how from Django, I would be able to represent all those calls well and convert them to JSON.
Also, no. This question is for a project I am doing on my own and Mirielle was being helpful, especially in helping me figure out the data structure.
+ 1
Justice you can use the cdn link
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
+ 1
Mirielle alright, though there is one thing I would like to confirm that is a onetomany relationship to self actually creates a tree structure
+ 1
Anonymous Bob_Li I'm going to kindly ask that you guys stop answering this question now because you are giving me links to stuff I already know at this point.
I have already made it clear that I will not be implementing this at the moment and I will ask that is respected. This was a great conversation and I've learned a lot but it should be done elsewhere at this point. The answers in this thread is nearly 50.
+ 1
Bob_Li If you've done such a project before I'd love for you to share if so I could take a look. Sometimes seeing a real implementation helps me understand things better than just text.
Not sure why you need to comment that I'm overthinking though when I just merely said I am not familiar with the data structure it will resemble and just want more practice.
0
A simple way to do this is
class Comment(models.Model):
... # comment fields
parent = models.ForeignKey('self', on_delete=models.cascade, related_name='children')
0
Anonymous Yeah but the API call would not be simple so I will not be doing that for now, but thank you. I'll come back to it as I said in my replies before.