2017-04-03 119 views
1

私はDjangoプロジェクトに取り組んでいて、考えているデータのリンクされたモデルを作成しようとしていますが、リンクされたデータへのアクセス方法を考えることができません。Django - 外部キーからデータを取得する

class One(models.Model) 
    name = models.CharField(max_length=50) 
    list = models.ArrayField(models.CharField(max_length=50), blank=True) 

    def __str__(self): 
    return self.name 

class Many(models.Model) 
    name = models.CharField(max_length=50) 

    related = models.ForeignKey(One, null=True, blank=True) 

    def __str__(self): 
    return self.name  

これは私が設定した一般的な関係です。

私がしようとしているのは、テンプレートにすべての 'Ones'のリストへのアクセス権があり、それらのそれぞれを介して各Manyにアクセスでき、関連する属性です。私は単一の 'One'の属性にアクセスする方法を見ることができますが、それらのすべてとそれらに関連する 'Many'モデルとそれぞれに関連する属性を渡す方法ではありません。基本的に私が望む出力は、Oneのリストをドロップダウンリストに入れ、これが提出されると、Javascriptはいくつかのことをするために 'Many'モデルのリストを使用します。

アドバイスをいただければ幸いです。

+0

あなたはAJAX呼び出しを使用してUIを更新しようとしているが、すなわち最初のドロップダウンでの選択に基づいて、2番目のドロップダウンのオプションを移入? – AKS

+0

いいえ、私は実際OpenLayersを使用していますので、リストは実際に地図上で強調表示される国名で表示されます – Nowandthen98

答えて

1

Oneモデルクラスのオブジェクトを持つ場合、many_setbackward relationsを参照)を使用してmanyオブジェクトにアクセスできます。

{% for one_obj in one_objs %} 
    {% for m_obj in one_obj.many_set.all %} 
     # do stuff with m_obj here 
    {% endfor %} 
{% endfor %} 

ここで重要な点は、m_objごとにdbクエリを実行することです。これを効率的にするために、many_setone_objsでプリフェッチすることができます。あなたのビューで

prefetch_relatedを使用します。

one_objs = One.objects.all().prefetch_related('many_set') 
1

逆引き参照は、オブジェクトの___set属性によってアクセスできます。だから、すべてのために「多くの」オブジェクトを取得するには、テンプレートでの使用については

Django reverse lookup of foreign keys

は、セットが追加することでアクセス可能なone.many_set与えられた「ひとつは、」あなたは何ができる「すべて」(セットが返されますので、クエリセット、テンプレートに含め、それに対してクエリを実行することができます)

Access ForeignKey set directly in template in Django

は、Djangoのドキュメントの関連セクションを参照してください:https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward

1

あなたはジャンゴを使用することができます"prefetch_related"とDjangoの "related_name"です。

また、この質問はhereと回答しました。

けれども、ここではまず、これまでお使いの外部キー定義を変更、あなたが望むかもしれないものである:

related = models.ForeignKey(One, null=True, blank=True, related_name='relateds') 

次にあなたが外部キー逆取得することができます:既に場合

one = One.objects.get(name="TheOneYouWant").prefetch_related('relateds') 
manys = one.relateds 
関連する問題