考虑一个在两个其他模型实例之间形成连接的Django模型:
class User(models.Model):
pass
class Meeting(models.Model):
user_a = models.ForeignKey(User, related_name='a_meetings')
user_b = models.ForeignKey(User, related_name='b_meetings')
现在假设您要定义一个返回所有User
会议的函数,无论他是a
还是b
。天真的实施将是:
class User(models.Model):
@property
def meetings(self):
return list(self.a_meetings.all()) + list(self.b_meetings.all())
让这个函数返回匹配的QuerySet
而不是列表的“正确”方法是什么?优惠解决方案的奖励积分不使用丑陋的Q
查询;)
答案 0 :(得分:2)
我认为Qs在这里是不可避免的。
这些事情的主要原则始终是从你真正想要得到的模型开始:所以既然你想要开会,就从那里开始。
return Meeting.objects.filter(Q(user_a=self) | Q(user_b=self))