2017-01-01 2 views
1

多対多の関係のアイテムのリストを照会する際に問題があります。私が照会しようとしているモデルは以下の通りです。これは、労働者が「開口部」を選択し、多くの労働者が同じ「開口部」を選択できるモデルである。私は「開口部」を選択した労働者のリストを選択しようとしていますが、成功していません。Django manytomany照会なしおよび/または不合格表示

class FavOpening(models.Model): 
    opening = models.OneToOneField(Openings, blank=True, default=None) 
    worker = models.ManyToManyField(Worker, blank=True, default=None) 

    def __unicode__(self): 
     return str(self.opening) 

Iが選択された作業者(ID-31)に基づいて、開口の種類については、以下にこれを試み、それが動作し、作業者が選択した開口部が印刷されるので、それは非常に奇妙です。

employee = get_object_or_404(Worker, id=31) 
print employee.favopening_set.all() 

しかし、私は以下のようにmanytomany内で作業者を取得するためにそれ以外の方法でラウンドを行うと、動作しません。 Workers.Workerを示す -

openingobj = get_object_or_404(Openings, id=1) 
print openingobj.favopening_set.all() 

は、私はまた、開口部(ID = 1)に基づいて労働者のリストを取得するには、以下を実行しようとしましたが、私は何の結果を得ていないのです、それは属性「favopening_set」を持っていないと言います。最後に、私は取得するには、プリフェッチを使用すると言ういくつかの研究に基づいて以下にこれを試してみました、私は[次の開口部を選択した少なくとも1つのワーカーを持っているので、真されていません。(私は管理者に確認)

openingobj = get_object_or_404(Openings, id=1) 
print openingobj.favopening.worker 

なし、物事のセット - What's the difference between select_related and prefetch_related in Django ORM?が、開口部のインスタンスを介してマネージャにアクセスすることはできません。

openingobj = get_object_or_404(Openings, id=1) 
openingobj.objects.prefetch_related('favopening_set').all() 

私はこれをどのように行うことができますか有用なアドバイスをありがとう。

+1

私はなぜあなたが 'favopening_set'を使用しようとしたのか分かりません。それは1対1の関係です。セットではありません。正しいアクセサは、次のスニペットで正しく使用された 'favopening'です。 –

+0

こんにちはダニエル、私はあなたがアドバイスしたように私が好きな人がいるときに、オープニングを取得しています。私は、このオープニングを選んだ労働者のリストを得るためにマネージャーが必要なので、オブジェクトを好きにしてみようとしましたが、 "FavOpeningインスタンスを介してマネージャーにアクセスできない"というエラーが出ています。 dir(openingobj.favopening)は、オブジェクトが使用できる属性のリストの中にあることを示します。 – user3655574

答えて

4

だからあなたは開口部を選択したすべての労働者のクエリセットを取得したいコメント

のアカウントフィードバックに取るために、応答を編集しました。 以下のコードは役に立ちますか?

openingobj = get_object_or_404(Openings, id=1) 
    workers_queryset = opening.favopening.worker.all() 

「ワーカー」の名前を「ワーカー」に変更することをお勧めします。

+0

実際には、私はquerysetを取得する必要があります - 開口部を選択した労働者のリスト。とにかく、私はopeningobj.favopening_set.all()を使用したときにそれを試してみました - それは私にエラーを与えました - 'FavOpening'オブジェクトには属性 'all'がありません。 – user3655574

+1

ありがとうアレックス、それは今動作します。少し修正すると、workers_queryset = opening.favopening.worker.all()の代わりにworkers_queryset = openingobj.favopening.worker.all()する必要があります。私はopeningobj.favopening.workerで停止しました。なぜなら結果には労働者が現れていたからです。労働者。いいえ、私は混乱していました。ありがとうございました!! – user3655574

+1

うれしかったことがうれしい!オタクのために申し訳ありません、実際には、オープニングではなく、openingobjでなければなりません! –

関連する問題