2017-10-02 7 views
0

と私は、次のようなデータ構造を持っている:複数の同一の親テーブルへのForeignKeyが、ユニークな識別子

  • Statestate_idnameを持っています。 (例:California):
  • Towntown_idarea_idstate_id、およびnameを持って
  • Areastate_idarea_idnameArea of San Francisco、いくつかの村やサンフランシスコが含まれている例が)持っています。 (例:Town of San Francisco
  • Streetstreet_idtown_idarea_idstate_idnameを有しています。以下

  • state_idが(オートインクリメントINTのような)実際のIDが、各状態の固定数ではありません。
  • area_idは、自動インクリメントintではなく、固定数です。これは、2つの異なる状態(複数の領域を持つには十分に大きい)が同じIDを持つ状態を持つことを意味します。 (サンフランシスコの状態は、サンフランシスコ(area_id = 1)を持つことになりますし、状態NYはNY(area_id = 1)を持つことになります。
  • town_idを...あなたはstate_idarea_idと同じ、それを推測。

しないでくださいなぜデータがそのように構造化されているのかを主張すると、それはこの質問の範囲を超えて、私がリファクタリングできるものを超えているので、

これは、町にarea_idとの両方が含まれている必要があることを意味しますそれが識別可能であること。そして、通りには、town_id,area_idおよびstate_idが含まれている必要があります。

私はarea.townsを実行し、その地域のすべての町を取得するか、state.streetsとし、その州のすべての通りを取得することができますどのようにDjangoモデルとの関係を表現することができますか?

質問が不明な場合は、必要な情報を更新していただければ幸いです。ただ質問してください。

+0

ManyToManyFieldを調べましたか? https://docs.djangoproject.com/en/111/topics/db/examples/many_to_many/ –

+0

この質問は理解するのが少し複雑です。もし私がそれを正しくしたら、多分unique_togatherがあなたを助けることができたでしょう: https://docs.djangoproject.com/en/1.11/ref/models/options/#unique-together –

答えて

1

私はデータモデルの他の側面について言及したいと思いますが、それらを記述するときの制約を理解していると思います。私は、state_idまたはduplicitive idの定義に関してちょっと逸脱するかもしれません。私はそれらを得ることはできませんが、あなたはカスタム保存機能を通してこれらの定義を達成できると仮定します。

class State(models.Model): 
    #implicit autoincrement id 
    name = models.CharField(max_length=200) 
    state_id = models.IntegerField() 

    def listAreasByState(self): 
     return Area.objects.filter(state=self) 

    def listAreasByStateID(self): 
     return Area.objects.filter(state_id=self.state_id) 


class Area(models.Model): 
    #implicit autoincrement id 
    name = models.CharField(max_length=200) 
    state = models.ForeignKey(State, blank=True, null=Tru) 
    state_id = models.IntegerField() 
    area_id = models.IntegerField() 

.... 

私はあなたの質問の要点を得ていますか? state_id、area_id viceエリアの自動増分IDをどこでどのように定義するのかはわかりません。しかし、あなたがしたいと思うように聞こえるのは、すべての子をすべての親に対して返すカスタム関数を書くことです。

+0

ああ、そうです。だからあなたの提案は、メンバーの代わりに関数を使うことです。それはうまくいくはずです。私はあまりにもメンバーと一緒にやろうとしていました。さて、それを確認してみましょう。 Btw、状態ID、エリアID、町のIDを手動で選択/ハードコード。私は本当に理由を知らないが、それは他のアプリケーションの互換性と関係があると思われる。 – alexandernst

関連する問題