Safari
Safari

Reputation: 11935

Django ORM extra info in query

I have some models in my Django application like this:

I have a Post entity:

class Post(models.Model):
    ....

And LikePost entity to save the users that has created a Like on a post.

class LikePost(models.Model):
    # Author info
    author_user = models.ForeignKey(User, null=True, related_name='post_likes')

    post = models.ForeignKey(Post, related_name="likes")
    dateJoined = models.DateTimeField(auto_now_add=True)

I need to retrieve some Post:

Post.objects.filter(....)...

but for each Post I need also to know if the current user has already performed a like action on the post.

So, I need to have a query to retrieve the list of post and for each post set info I would to annotate also this extra info (for example an additional field 'liked'= True|False)

I have to tried something like 'extra' function but I failed to use this on two model: query on Post and extra info on LikePost. Is possible this? Any examples is welcome!

-------- EDIT ---------

!! I can't change my models configuration !!

Upvotes: 0

Views: 205

Answers (1)

doniyor
doniyor

Reputation: 37876

I would not separate these two models. Just add new field liked_by to Post Model

class Post(models.Model):
   user = models.ForeignKey(User, related_name='user_posts')
   liked_by = models.ManyToMany(User, related_names='liked_posts')

and

user_liked_posts = request.user.liked_posts.all()

If you cannot change models, then:

user_liked_posts = request.user.post_likes.select_related('post')
# likes on posts done by request.user
# so "author_user" is request.user  
for like in user_liked_posts:
    like.dateJoined
    like.post.title 

Upvotes: 1

Related Questions