2011-02-09 8 views
0

カスタムSQLを使用するために必要なものがいくつかあります。ちょうど私がなぜカスタムSQLを使用しているのかを議論することはまずありません。これは古く、ここでは無関係です。カスタムマネージャでカスタムSQLを使用する際に、関連するDjangoモデルを設定するにはどうすればよいですか?

とにかく、このカスタムSQLを使用して、モデルを作成し、関連する/サブモデルを作成しようとしています。関連するモデルがビューまたはテンプレート内でアクセスされるまで、すべてうまくいくようです。私がこれを行うと、djangoは別のSQLクエリを開始します。これは最初のクエリで既にデータを取得しているので、まったく必要ありません。例として

class Preferredname(models.Model): 
    preferredname_id = models.CharField(primary_key=True, max_length=1) 
    name = models.CharField(max_length=255) 

class PersonCustom(models.Manager): 
    def getSpecial(self): 
     from django.db import connection, transaction 
     curse = DictCursor(connection.cursor()) 

     curse.execute("SELECT * FROM person WHERE special = 't'") 
     result_list = [] 
     for row in curse.fetchall(): 

      i = self.model(
       firstname = row['firstname'], 
       middlename = row['middlename'], 
       nickname = row['nickname'], 
       lastname = row['lastname'], 
       suffix = row['suffix'], 
      ) 

      i.preferredname = Preferredname() 
      i.preferredname.preferredname_id = row['preferredname_id'] 

      result_list.append(i) 

     return result_list 

class Person(models.Model): 
    person_id = models.IntegerField(primary_key=True) 
    firstname = models.CharField(max_length=255, blank=True) 
    middlename = models.CharField(max_length=255, blank=True) 
    lastname = models.CharField(max_length=255, blank=True) 
    nickname = models.CharField(max_length=255, blank=True) 
    suffix = models.CharField(max_length=255, blank=True) 
    preferredname = models.ForeignKey(Preferredname) 
    objects = PersonCustom() 

    def get_preferred_name(self): 

     try: 
      if self.preferredname.preferredname_id == 'N': 
       pref = self.nickname 
      elif self.preferredname.preferredname_id == 'M': 
       pref = self.middlename 
      else: 
       pref = self.firstname 

     except ObjectDoesNotExist: 
      if self._preferred_name == 'N': 
       pref = self.nickname 
      elif self._preferred_name == 'M': 
       pref = self.middlename 
      else: 
       pref = self.firstname 

     name = "%s %s %s" % (pref, self.lastname, self.suffix) 

     return name.strip() 

    def set_preferred_name(self, val): 
     self._preferred_name = val 

    preferred_name = property(get_preferred_name, set_preferred_name) 

:ここ

は、アップトリムモデル例であるget_preferred_nameので

>>> p = Person.objects.getSpecial() 
>>> p[0].preferred_name 

()メソッドはself.preferredname.preferredname_idにアクセスする(理論的には、既にあるべきですpopulated)は、preferrednameの別のクエリーを作成します。

私はここでベースをオフにしていますか、これは私の意図どおりに動作するのでしょうか?私がここにいるのであれば、カスタムマネージャーから関連するモデルを取り込む方法はありますか?

答えて

1

i.preferrednameにオブジェクトを割り当てるのではなく、Djangoが外部キーの参照をキャッシュするために使用する内部オブジェクトである​​に設定してみてください。それはうまくいくはずです。

+0

あなたはウィザードです! –

+0

バー、申し訳ありません。上記の私の例が動作するようです。私は脳が揚げられている間に質問をするのを止める必要があります。しかし、これはかなり有益な情報ですが、それもうまくいくので、私はあなたに答えを与えます。ありがとう。 –

関連する問題