Reputation: 270
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
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
Reputation: 476699
You can filter with:
Meeting.objects.filter(
members__email=request.user.email
)
to retrieve all the Meeting
s 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
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