django-如何将具有外键的多个模型的结果与同一用户合并?

django-如何将具有外键的多个模型的结果与同一用户合并?,django,django-models,django-views,django-queryset,Django,Django Models,Django Views,Django Queryset,我有多个模型指向同一用户,如下所示: class Model1(moldels.Model): user = models.ForeignKey(User) title = models.CharField() ... class Model2(moldels.Model): user = models.ForeignKey(User) ... class Model3(moldels.Model): user = models.F

我有多个模型指向同一用户,如下所示:

class Model1(moldels.Model):
     user = models.ForeignKey(User)
     title = models.CharField()
     ...

class Model2(moldels.Model):
     user = models.ForeignKey(User)
     ...

class Model3(moldels.Model):
     user = models.ForeignKey(User)
     ...
objs1 = Model.objects.filter(title__icontains='YOUR FILTER')
users = objs1.values('user').distinct()
objs2 = Model2.objects.filter(user__in=users)
objs3 = Model3.objects.filter(user__in=users)

objs = list(objs1)
objs.extend(list(objs2))
objs.extend(list(objs3))
return objs

如何在
Model1
上的
title
字段中进行搜索/筛选,并将来自具有相同用户的其他模型的结果合并在一起。只有Moldel1将为同一用户返回多个结果。Model2和Model3将始终为每个用户返回一个结果(如一个化身和一个配置文件)。-谢谢大家!

这取决于你所说的“加入”是什么意思。您可以通过
用户
和模型的
相关名称
(默认情况下:
\u集
)从任何其他用户访问一个,例如:

或者,您可以使用用户实例直接访问每个实例:

user.model1_set.all()
user.model2_set.all()
user.model3_set.all()
您也可以通过用户查询这些模型,包括查询遍历:

User.objects.filter(model1__title='some title')
最后,对于只有一个实例的模型,例如每个用户一个概要文件,您应该真正使用
OneToOneField
,而不是
ForeignKey
。如果您这样做,则可以对属于
OneToOneField
(真正的SQL联接)的任何反向关系使用
select\u related
,例如:


但是,
select_related
不适用于反向外键关系或多对多关系。为此,您必须等待Django 1.4在与
预取相关的
中删除,如果您想要获得查询集,这是不可能的。您无法获得各种模型的查询集

但我认为你想要这样的东西:

class Model1(moldels.Model):
     user = models.ForeignKey(User)
     title = models.CharField()
     ...

class Model2(moldels.Model):
     user = models.ForeignKey(User)
     ...

class Model3(moldels.Model):
     user = models.ForeignKey(User)
     ...
objs1 = Model.objects.filter(title__icontains='YOUR FILTER')
users = objs1.values('user').distinct()
objs2 = Model2.objects.filter(user__in=users)
objs3 = Model3.objects.filter(user__in=users)

objs = list(objs1)
objs.extend(list(objs2))
objs.extend(list(objs3))
return objs