2011-05-06 23 views
0

私はこの "仕事"モデルを持っています(下記参照)。M2Mと外部キーの関係でのdjangoモデルの問題

  • ホストと場所の間にM2M関係があります(場所には複数のホストが割り当てられています)。場所と時間帯の間に定義された外部キー関係(場所は、タイムゾーンを割り当てられている)

とタイムゾーンのクラスを持って、私はまた私がいる問題は、私はアンコメントすることができないということです

  • 「結腸」 "Location"への外部キー参照のために、Hostクラス内の項目Locationクラスは、Hostクラスの後に定義されます。しかし、Locationクラスの "hosts"のためのM2M参照のため、私はLocationの定義をHostクラスの上に移動することはできません。

    概念的に何か不足していますか?どんな助けでも大歓迎です!ここで

    は私のモデルの関連する部分である:

    class Timezone(models.Model): 
        name = models.CharField(max_length=32, unique=True) 
        def __unicode__(self): 
         return "%s"%(self.name) 
    
    class Host(models.Model): 
        name = models.CharField(max_length=32, unique=True) 
    # colo = models.ForeignKey(Location) 
        def __unicode__(self): 
         return "%s"%(self.name) 
    
    class Location(models.Model): 
        name = models.CharField(max_length=3, unique=True) 
        hosts = models.ManyToManyField(Host, blank=True) #not required 
        tz = models.ForeignKey(Timezone) 
        def __unicode__(self): 
         return "%s"%(self.name) 
    
  • 答えて

    0

    は、あなたが

    を行うことができ、ホストモデルから locationsフィールドを削除、または coloを削除し、場所からすべてのホストを取得するには locations

    location = models.ForeignKey(Location)に変更することができます

    location = Location.objects.get(pk=1) 
    hosts = location.host_set.all() #returns all hosts for the location 
    

    は、ここではDjango docs about backwards relationships

    +0

    ああ!それはまさに私が必要としていたものです。私はモデルの後方関係を定義することについて心配してはいけません。私は、必要に応じて私のビュー内の関係を逆にするためにクエリセットとフィルタを使用する必要があります。ありがとう!!! – nnachefski

    1

    それが定義されている前に、基本的に、あなたは場所のクラスを参照することはできません。したがって、ホストと場所のクラスの順序を変更すると役立ちます。そして、多対多関係は、まだ定義されていないHostクラスを参照します。しかし、多対多リレーションシップはどちらのテーブルでも定義できるので、Hostクラスに移動するだけです。ここで変更したコードされています

    class Timezone(models.Model): 
        name = models.CharField(max_length=32, unique=True) 
        def __unicode__(self): 
         return "%s"%(self.name) 
    
    class Location(models.Model): 
        name = models.CharField(max_length=3, unique=True)  
        tz = models.ForeignKey(Timezone) 
        def __unicode__(self): 
         return "%s"%(self.name) 
    
    class Host(models.Model): 
        name = models.CharField(max_length=32, unique=True) 
        colo = models.ForeignKey(Location, related_name='colocation') 
        locations = models.ManyToManyField(Location, blank=True) #not required 
        def __unicode__(self): 
         return "%s"%(self.name) 
    
    +0

    へのリンクの迅速な対応をありがとうございましたが、ホストは一箇所だけ、それが中に存在するコロケーションを持っています。 – nnachefski

    +0

    しかし、あなたのLocationクラスでHostクラスに多対多の関係が定義されていますか? –

    +0

    これはあなたの質問には関係ありませんが、あなたのタイムゾーンモデルについてdjango-timezonesをチェックしたいかもしれません。それは、タイムゾーンに関連する頭痛のいくつかを減らすことができるいくつかの素晴らしい機能があります。 https://github.com/brosner/django-timezones –

    1

    あなたがホストと場所の間、多くの関係に多くを持っているが、しかし、あなたが欲しいのは、ホストが、あなたが実際にホスト間の一対多の関係を望んで同じ場所を持つことができるようにすることですし、場所。これは、Hostクラスにあるmodels.ForeignKeyを使用して宣言されます。 HostクラスがLocationクラスの後に表示されるようにコードを並べ替えるだけで、参照できるようになります。また、多対多の関係を削除することもできます。

    class Timezone(models.Model): 
        name = models.CharField(max_length=32, unique=True) 
        def __unicode__(self): 
         return "%s"%(self.name)  
    
    class Location(models.Model): 
        name = models.CharField(max_length=3, unique=True) 
        tz = models.ForeignKey(Timezone) 
        def __unicode__(self): 
         return "%s"%(self.name) 
    
    class Host(models.Model): 
        name = models.CharField(max_length=32, unique=True) 
        colo = models.ForeignKey(Location) 
        def __unicode__(self): 
         return "%s"%(self.name) 
    

    これを実行する最善の方法はわかりませんでしたので、別の回答を書きます。私の最初の答えは基本的に、nnachefskiが質問で定義したモデルを作成することを許可しました。彼のコメントを読んだ後、彼は実際に彼が定義したモデルとは少し異なるモデルを実際に望んでいたことに気付きました。ホストがしか一つの場所を持つことになりますので