在自定义管理器中使用自定义SQL时,如何填充相关的Django模型?
我有一些东西需要使用自定义SQL。首先,我不想讨论为什么要使用自定义SQL。这在这里是老生常谈了 无论如何,使用这个自定义SQL,我正在填充模型并尝试填充相关/子模型。在视图或模板中访问相关模型之前,一切似乎都进展顺利。如果我这样做,django将启动另一个SQL查询,这是完全不必要的,因为我已经在第一个查询中获得了数据 以下是修剪模型的示例:在自定义管理器中使用自定义SQL时,如何填充相关的Django模型?,django,django-models,Django,Django Models,我有一些东西需要使用自定义SQL。首先,我不想讨论为什么要使用自定义SQL。这在这里是老生常谈了 无论如何,使用这个自定义SQL,我正在填充模型并尝试填充相关/子模型。在视图或模板中访问相关模型之前,一切似乎都进展顺利。如果我这样做,django将启动另一个SQL查询,这是完全不必要的,因为我已经在第一个查询中获得了数据 以下是修剪模型的示例: class Preferredname(models.Model): preferredname_id = models.CharField(p
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)
例如:
>>> p = Person.objects.getSpecial()
>>> p[0].preferred_name
由于get\u preferred\u name()方法访问self.preferredname.preferredname\u id(理论上应该已经填充了该id),因此它会对preferredname进行另一个查询
我是离开这里了,还是应该按照我的意愿工作?如果我不在这里,有没有办法从自定义管理器中填充相关模型?而不是将对象分配给
I.preferredname
,尝试将其设置为I.\u preferredname\u cache
,这是Django用来缓存外键查找的内部对象。那应该行。呸,对不起。看来我上面的例子确实有效。我需要停止问问题,因为我的大脑已经崩溃了。然而,这是一些非常有用的信息,它也很有效,所以我会给你答案。谢谢