Django通过表格从多对多获取相关信息

时间:2019-04-03 14:12:20

标签: django django-rest-framework django-views

我有类似以下模型的东西

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)

但是我需要以某种方式为每个事件(对于当前用户)从“ UserEventAttendence”模型中添加“ attended”字段,但是我没有任何线索。

2 个答案:

答案 0 :(得分:0)

我认为您必须独立地参加会议并建立元组列表:

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

或作为上下文传递给模板处理器。

答案 1 :(得分:0)

您可以将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约束。