Джанго получает связанную информацию от многих ко многим через таблицу - PullRequest
0 голосов
/ 03 апреля 2019

У меня что-то похожее на следующую модель

class User(Model):
    username = CharField(...)

class Event(Model):
    event_name = CharField(...)
    event_rating = IntegerField
    users = ManyToManyField(User, through="UserEventAttendence")

class UserEventAttendence(Model):
    user = ForeignKey(User)
    event = ForeignKey(Event)
    attended = BooleanField()

class EventComments(Model):
    name = CharField(...)
    content = CharField(...)
    event = models.ForeignKey(Event, related_name='eventcomments', on_delete=models.CASCADE)

На мой взгляд, я пытаюсь получить все события, пользователей для каждого события, а затем из этого фильтра отфильтровать события, которые собирается текущий пользователь,Ниже приведен мой текущий запрос (впоследствии он отправляется в сериализатор, а затем отправляется в качестве ответа)

events = models.Event.objects.using(db_to_use).prefetch_related(
            Prefetch('users', queryset=models.UserProfile.objects.using(db_to_use))
        ).prefetch_related(
            Prefetch('eventcomments', queryset=models.EventComments.objects.using(db_to_use))
        ).filter(usereventattendence__user_id=request.user.id)

Но мне нужно как-то добавить поле «Participated» из модели «UserEventAttendence» для каждого события (длятекущий пользователь), но я понятия не имею, как это сделать.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Вы можете сохранить значение attended в качестве аннотации для Event объектов:

# events is your queryset as defined in the question
# I'm not entirely sure if the field name should be 
# 'usereventattendence__attended'
# or 
# 'user_event_attendence__attended'
events.annotate(attended=F('usereventattendence__attended'))

Затем вы можете получить доступ к attended для отдельных событий:

for e in events:
    print(e.attended)

Одна заметка о вашей промежуточной модели.Он не определяет уникальные ограничения, что означает, что теоретически, по крайней мере, у вас может быть несколько записей для одной и той же пары событие-пользователь (что приводит к дублированию Event объектов в вашем запросе).Если это нежелательно, вы можете определить ограничение unique_together для промежуточной модели.

0 голосов
/ 03 апреля 2019

Я думаю, что вы должны самостоятельно получить посещаемость и создать список кортежей:

events_list = []
for event in events:
    attended = event.usereventattendence_set.filter(user=request.user).attended
    event_list.append((event, attended))

Затем вы можете выполнить итерацию:

for event, attended in event_list:
    # do stuff

Или передать в качестве контекста обработчику шаблонов.

...