Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在自定义管理器中使用自定义SQL时,如何填充相关的Django模型?_Django_Django Models - Fatal编程技术网

在自定义管理器中使用自定义SQL时,如何填充相关的Django模型?

在自定义管理器中使用自定义SQL时,如何填充相关的Django模型?,django,django-models,Django,Django Models,我有一些东西需要使用自定义SQL。首先,我不想讨论为什么要使用自定义SQL。这在这里是老生常谈了 无论如何,使用这个自定义SQL,我正在填充模型并尝试填充相关/子模型。在视图或模板中访问相关模型之前,一切似乎都进展顺利。如果我这样做,django将启动另一个SQL查询,这是完全不必要的,因为我已经在第一个查询中获得了数据 以下是修剪模型的示例: class Preferredname(models.Model): preferredname_id = models.CharField(p

我有一些东西需要使用自定义SQL。首先,我不想讨论为什么要使用自定义SQL。这在这里是老生常谈了

无论如何,使用这个自定义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)
例如:

>>> 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用来缓存外键查找的内部对象。那应该行。

呸,对不起。看来我上面的例子确实有效。我需要停止问问题,因为我的大脑已经崩溃了。然而,这是一些非常有用的信息,它也很有效,所以我会给你答案。谢谢