我有类似以下模型的东西
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”字段,但是我没有任何线索。
答案 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
约束。