カスタム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の別のクエリーを作成します。
私はここでベースをオフにしていますか、これは私の意図どおりに動作するのでしょうか?私がここにいるのであれば、カスタムマネージャーから関連するモデルを取り込む方法はありますか?
あなたはウィザードです! –
バー、申し訳ありません。上記の私の例が動作するようです。私は脳が揚げられている間に質問をするのを止める必要があります。しかし、これはかなり有益な情報ですが、それもうまくいくので、私はあなたに答えを与えます。ありがとう。 –