Niloofar
Niloofar

Reputation: 270

how to use django related_name

I have two models named Meeting and MeetingMember like this :

 class Meeting(models.Model):
      title = models.CharField(max_length=255)
      description = models.TextField()

 class MeetingMember(models.Model):
     CHOICES = [
         ("A", "Accepted"),
         ("R", "Rejected"),
         ("I", "Invited" ),
         ("H", "Host"),
     ]
 
     status = models.CharField(max_length=9, choices=CHOICES, default="I")
     meeting = models.ForeignKey(Meeting, on_delete=models.CASCADE, related_name="members")
     email = models.EmailField(blank=True)

I need to write a query that first gets all the records in MeetingMeember model which belong to the current logged in user like this :

meetingmembers  = MeetingMember.objects.filter(email = request.user.email)

then i need to the get all the info from the meetings belongs to the MeetingMeember (the second queryset should be Meeting object) i have studied about related_name but still can't figure out how can i write this.

Upvotes: 0

Views: 323

Answers (3)

Tanvir Ahmed
Tanvir Ahmed

Reputation: 387

According to your design an Meeting object belongs to multiple MeetingMember objects and you can access them using related name members like metting_obj.members.all() and an MeetingMember object belongs to a single Meeting object and you can assess using the attribute meeting like metting_member_obj.metting

you can retrieve all Meeting objects belongs to MeetingMember objects as following:

meeting_objs = [meeting_member.meeting for meeting_member in meetingmembers]

Upvotes: 2

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476699

You can filter with:

Meeting.objects.filter(
    members__email=request.user.email
)

to retrieve all the Meetings for which the email of the logged in user is a member.

If you work with the Member model, you can use .select_related(…) [Django-doc] to retrieve the Meeting object in the same query, then for some_member, you can access the related Meeting (and info with) some_member.meeting without making an extra query:

meetingmembers = MeetingMember.objects.filter(
    email=request.user.email
).select_related('meeting')

for member in meetingmenbers:
    print(member.meeting)

Upvotes: 3

Md Shahbaz Ahmad
Md Shahbaz Ahmad

Reputation: 1166

The related_name attribute specifies the name of the reverse relation from the Meeting model back to MeetingMember model.

If you have MeetingMember object like meeting_member and your related_name is 'members' then meeting_member.members.all() to get all instances of your Meeting model that have a relation to object.

Upvotes: 2

Related Questions