2011-12-06 1 views
2

は、私はこのように同じユーザーを指して複数のモデルを持っている:Model1titleフィールド上で検索/フィルタを行うと、同じユーザーを持つ他のモデルからの結果を結合することができるように何django - 同じユーザーの外部キーを持つ複数のモデルの結果にどのように結びつきますか?

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) 
    ... 

。 Moldel1だけが同じユーザーに対して複数の結果を返します。 Model2とModel3は、すべてのユーザー(1つのアバターや1つのプロファイルなど)に対して常に1つの結果を返します。 - ありがとうございました!

答えて

1

"参加"という言葉の意味によって異なります。例えば、:あなたはuserと(<lowercase class name>_setデフォルト):モデルのrelated_nameかかわらず、他から1にアクセスすることができます

model1_instance.user.model2_set.all() 

それとも直接にアクセスするためのユーザーインスタンスを使用することができます。

user.model1_set.all() 
user.model2_set.all() 
user.model3_set.all() 

クエリトラバーサルでこれらのモデルをクエリすることもできます。

User.objects.filter(model1__title='some title') 

最後に、1つだけのモデルたとえば、ユーザーあたり1つのプロファイルなど、実際にForeignKeyの代わりにOneToOneFieldを使用する必要があります。あなたがそれを行うならば、あなたはOneToOneField(真SQL JOINを)、例えば任意の逆の関係にselect_relatedを使用することができます。しかし

User.objects.filter(model1__title='some title').select_related('model2', 'model3') 

select_relatedは逆の外部キー関係上、または多対ない動作します多数の関係。そのためには、prefetch_relatedでDjango 1.4が落ちるまで待たなければなりません。

0

クエリーセットを取得したい場合は、これは不可能です。あなたは様々なモデルのクエリーセットを手に入れることはできません。

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 

しかし、私はあなたがこのような何かをしたいと思います

関連する問題