2017-11-20 3 views
1

からモデル化するためのフィールドをインポートするには、Especie.zonasのベクトルがモデルソナ内のフィールドであることを取得しよう。Djangoは、私は次のモデルを持っていると私は別のモデル

すなわちEspecie.zonasはZonas(モデルゾナ)のベクトルであり、私はそれがモデルEspecieZona

Models.py

class Zona(models.Model): 
    codigo   = models.CharField(max_length=120) 
    area   = models.CharField(max_length=120) 
    especies  = models.ManyToManyField("Especie", blank=True) 

     def __str__(self): 
      return self.codigo 
     def get_especies(self): 
      return self.especies.all().values_list('nome', flat=True) 

    class Especie(models.Model): 
     nome   = models.CharField(max_length=120) 
     nome_latino  = models.CharField(max_length=120) 
     data_insercao = models.DateTimeField(auto_now_add=True) 
     actualizacao = models.DateTimeField(auto_now=True) 
     zonas   = models.ManyToManyField("Zona",blank=True) 

     def get_zonas(self): 
      return self.zonas.all().values_list('codigo', flat=True) 
     def __str__(self): 
      return self.nome 

    class EspecieZona(models.Model): 
     idEspecie   = models.OneToOneField("Especie") 
     here_is_my_problem = models.Especie.zonas() 
     idZona    = models.OneToOneField("Especie.zonas") 
     fechado   = models.BooleanField() 
     def __str__(self): 
      return str(self.idEspecie)+' em '+str(self.idZona) 
とOneToOne関係を持つようにしたいです

ありがとうございます!

答えて

1

私はあなたの意図を完全には分かっていません。モデル間で関係を確立する必要があります(したがって、クラスのフィールドへのOneToOneはできません)。私が理解しているように、EspecieZonaは1つのZonaインスタンスに1つのEspecieインスタンスを関連付けますが、EspecieZonaを介してアクセスしているいくつかのEspecieインスタンスに関連するすべてのZonaインスタンスも簡単に取得したいと考えています。

here_is_my_problemフィールドを完全に削除し、OneToOneの代わりにEspecieZonaのEspecieとZonaに外部キーを使用するように思えます。外部キーを使用すると、ZonaからEspecieまでのManyToManyフィールドを使用することができます(またはその逆の場合、関係の一方の側でMtMフィールドを宣言しなければなりません)。そしてEspecieZonaを 'through'フィールドとして使用します(おそらくEspecieとZonaのunique_togetherの制約があります)。あなたはこのような関係を確立することができますこの方法:

「それぞれの種が複数のゾーンにすることができ、そして各ゾーンは(MTMの関係で説明)複数種を持つことができますまた、中に発見された各ゾーンと種用それらの種はそれぞれの種がその区域に記録されているかどうか(?)( 'through'モデル、EspecieZonaで説明されていますが、ここではfechadoの意味を理解できません。 2つのモデルの間の関係に関する詳細を記述する)"

次に、あなたがsomeSpecificEspecieZona.especie.zonas.all()を行うことができますEspecieZonaのインスタンスからEspecies.zonasを取得するために(あなたのその種に関連するすべてのゾーンになるだろう、(仮定zonas はEspecieでMTMフィールドとして宣言されています)

関係フィールドのドキュメントを読んで、ManyToManyField.throughを使用する方法、必要に応じてリバースリレーションシップを使用する方法など、すべての仕組みについての詳細を知ることをお勧めします。

は、(ここにコードをcopypastingときも、多分それはただのミスだったが、インデントが間違って見えます。異なるモデルがあり、インデントの同じレベルにする必要があります)すべての最初の

+1

は、あなたの答えのためにそれをあなたに感謝します両方とも明確かつ有用でした。おそらく最良の方法で質問をしないことに対する謝罪。私は非常にDjangoの新しいと時々私は語彙が欠けている。それでも、あなたは私の問題を完全に理解することができました! 「someSpecificEspecieZona.especie.zonas.all()」の意味と、「someSpecificEspecieZona」というメソッドがどのように見えるのかを指定しますか?私はあなたがEspecieZonaモデルの中に置くことを提案していると信じています。私はdjangoクラスをそれに付けるべきですか? models.someSpecificEspecieZona.especie.zonas.all()?あなたの時間と忍耐のためにもう一度感謝します! –

+1

ああ、 'someSpecificEspecieZona'は、モデルEspecieZonaのインスタンスのランダムな名前にすぎません。たとえば、 'someSpecificEspecieZona = EspecieZona.objects.get(id = 1)'の前にこの行があるかもしれません。そのため、内部のメソッドではなくモデルの使用でした。 '.especie'では、関連するEspecieインスタンスを取得し、次に.zonasを使用すると、そのEspecieインスタンスに関連付けられたZonaインスタンスを取得します。そして '.all()'は、マネージャではなくQuerySetを返すことですが、Djangoについてはかなり新しくなっていますので、私にとって説明するのは少し難しいです:https://stackoverflow.com/a/22806277/4192226 –

関連する問題