Как использовать django related_name
I есть две модели с именами Meeting и MeetingMember следующим образом :
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)
Мне нужно написать запрос, который сначала получает все записи в модели MeetingMeember, принадлежащие текущему вошедшему пользователю, следующим образом :
meetingmembers = MeetingMember.objects.filter(email = request.user.email)
Затем мне нужно получить всю информацию из встреч, принадлежащих члену встречи (второй набор запросов должен быть объектом Meeting). Я изучал вопрос о related_name, но все еще не могу понять, как я могу написать это.
Атрибут related_name задает имя обратного отношения от модели Meeting обратно к модели MeetingMember.
Если у вас есть объект MeetingMember типа meeting_member и ваше related_name равно 'members', то meeting_member.members.all(), чтобы получить все экземпляры вашей модели Meeting, которые имеют отношение к объекту.
Вы можете фильтровать с помощью:
Meeting.objects.filter(
members__email=request.user.email
)
получить все Meeting
, для которых email
вошедший пользователь является членом.
Если вы работаете с моделью Member
, вы можете использовать .select_related(…)
[Django-doc] для получения объекта Meeting
в том же запросе, тогда для some_member
вы можете получить доступ к связанному Meeting
(и информации с) some_member.meeting
без дополнительного запроса:
meetingmembers = MeetingMember.objects.filter(
email=request.user.email
).select_related('meeting')
for member in meetingmenbers:
print(member.meeting)
В соответствии с вашим проектом объект Meeting принадлежит нескольким объектам MeetingMember и вы можете получить к ним доступ, используя связанное имя members
, например metting_obj.members.all()
, а объект MeetingMember принадлежит одному объекту Meeting и вы можете оценить его, используя атрибут meeting
, например metting_member_obj.metting
вы можете получить все Meeting объекты принадлежащие MeetingMember объектам следующим образом:
meeting_objs = [meeting_member.meeting for meeting_member in meetingmembers]