2016-12-08 10 views
2

私の超過タイトルをお詫び申し上げます。Djangoモデルで一度DBにヒットして複数のテーブルの属性をnon-pk-columnで選択する方法はありませんか?

class Menu(models.Model): 
    menu_code = models.IntegerField(blank=False, null=False) # It expresses order of menu items so it often can be changed. 
    menu_title = models.CharField(max_length=20, blank=False, null=False) 
    submenu_title = models.CharField(max_length=20, blank=True, null=True) 

class Board(models.Model): 
    title = models.CharField(max_length=200, blank=False, null=False) 
    date = models.DateTimeField(default=timezone.now) 
    menu = models.ForeignKey(Menu) 

上記は私のmodels.pyの一部です。
私がしたいことは、SQLでは以下のようになります。

SELECT 
    * 
FROM 
    Board B, Menu M 
WHERE 
    B.menu_id=M.menu_id and 
    M.menu_title='cat'; 

または

SELECT 
    * 
FROM 
    Board B INNER JOIN Menu M 
ON 
    B.menu_id=M.menu_id and 
    M.menu_title='cat'; 

私はそれについて多くの質問と回答を見てきましたし、彼らは「select_related」を使用することになったが、鉱山は彼らの問題で若干の違いがあります。

  • 'menu_title'はメニューテーブルのPKではないため、ボードテーブルのフィルタメソッドはその属性を見つけることができません。

解決策はありますか?それともモデルデザインを変更する必要がありますか?

答えて

2

うん、あなたは、単に、

結果のクエリセットは次のようになります)(prefetch_relatedとmenu_titleのメニューモデルを取得するために、二重のアンダースコア(__)を使用することができますあなたのモデルを変更してくださいボードには外部キーメニューからメニューモデルがあります。おかげさまで

+0

ありがとう、それは動作します。 ダブルアンダースコアの使い方が混乱していたと思います。たぶん私はもっと慎重にgoogleする必要があります:) –

+0

@通진あなたの歓迎:) –

1

最初にいくつか挙げてください。 Menuにはmenu_idフィールドがありません。あなたの質問は1つを参照します。暗黙的に作成されたidを意味しましたか?

結合を行う生のSQLクエリを作成し、データを抽出してインスタンスを手動で構築することができます。

しかし、それは痛いでしょう。

モデルに外部キー関係を追加した方が簡単です。あなたがそれをしたくない理由がありますか?

query_set = Board.objects.filter(menu__menu_title = "cat").prefetch_related('menu') 

+0

ええ、暗黙的に作成されたため、コードにmenu_idがありません。 私が苦労していた問題は、単に二重の下線で外国のテーブルにアクセスできることを知らなかったことです。 私は次回に尋ねる前にもっとgoogleするべきだと思う。ありがとうございました。 –

関連する問題