Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Django 如何从postgresql视图表中获取要显示的对象列表_Django_Postgresql_Django Models_Django Views - Fatal编程技术网

Django 如何从postgresql视图表中获取要显示的对象列表

Django 如何从postgresql视图表中获取要显示的对象列表,django,postgresql,django-models,django-views,Django,Postgresql,Django Models,Django Views,这是视图表的一个模型 class QryDescChar(models.Model): iid_id = models.IntegerField() cid_id = models.IntegerField() cs = models.CharField(max_length=10) cid = models.IntegerField() charname = models.CharField(max_length=50) class Meta: db_table = u

这是视图表的一个模型

class QryDescChar(models.Model): 
 iid_id = models.IntegerField()
 cid_id = models.IntegerField()
 cs = models.CharField(max_length=10)
 cid = models.IntegerField()
 charname = models.CharField(max_length=50)
 class Meta:
     db_table = u'qry_desc_char'
这是我用来创建表的SQL

CREATE VIEW qry_desc_char as
 SELECT  
    tbl_desc.iid_id,
    tbl_desc.cid_id,
    tbl_desc.cs,
    tbl_char.cid,
    tbl_char.charname
FROM tbl_desC,tbl_char 
WHERE tbl_desc.cid_id = tbl_char.cid;

我不知道我是否需要模型或视图中的函数,或者两者都需要。我想从数据库中获取一个对象列表来显示它。这可能很容易,但我是Django和python的新手,因此我遇到了一些问题

您试图从视图中获取记录。这是不正确的,因为视图不映射到模型,而表映射到模型


应该使用Django ORM获取QryDescChar对象。请注意,Django ORM将直接从表中获取它们。您可以查阅Django文档以获取更多信息,并选择相关的方法,这些方法将允许您以不同的方式从其他表中获取相关数据。

如果您的RDBMS允许您创建可写视图,并且您创建的视图的结构与Django创建的表的结构完全相同,我想这应该是可行的直接。

Django 1.1引入了一个新功能,您可能会发现它很有用。您应该能够执行以下操作:

 class QryDescChar(models.Model): 
     iid_id = models.IntegerField()
     cid_id = models.IntegerField()
     cs = models.CharField(max_length=10)
     cid = models.IntegerField()
     charname = models.CharField(max_length=50)
 class Meta:
     db_table = u'qry_desc_char'
     managed = False
qry_desc_char_list = QryDescChar.objects.all()
托管元类选项的文档如下所示。相关报价:

如果为False,则不创建数据库表 或删除操作将被删除 为该模型执行。这是 如果模型表示 已存在的表或数据库视图 已经通过其他方式创建。 这是唯一的区别 这是错误的。的所有其他方面 模型处理与 正常

完成后,您应该能够正常使用您的模型。要获取对象列表,请执行以下操作:

 class QryDescChar(models.Model): 
     iid_id = models.IntegerField()
     cid_id = models.IntegerField()
     cs = models.CharField(max_length=10)
     cid = models.IntegerField()
     charname = models.CharField(max_length=50)
 class Meta:
     db_table = u'qry_desc_char'
     managed = False
qry_desc_char_list = QryDescChar.objects.all()

要真正将列表放入模板中,您可能需要查看通用视图,特别是对象列表视图。

这是一个老问题,但仍然会让人感到困惑,并且仍然与使用Django的任何人都高度相关,因为Django具有预先存在的规范化模式

在SELECT语句中,您需要添加一个数字id,因为Django需要一个数字id,即使在非托管模型上也是如此。如果某个位置的行上没有保证唯一的整数值,并且视图中经常出现这种情况,则可以使用row_number window函数来完成此操作

在本例中,我将在窗口函数中使用ORDER BY子句,但您可以执行任何有效的操作,并且在这样做的同时,您还可以使用在某些方面对您有用的子句。只需确保不要尝试使用Django ORM点引用关系,因为它们在默认情况下查找id列,而您的引用是假的

另外,如果要在对象中使用它,我会考虑将我的输出列重命名为更有意义的东西。有了这些更改,查询看起来更像是用您自己的术语替换AS子句:

CREATE VIEW qry_desc_char as
 SELECT
    row_number() OVER (ORDER BY tbl_char.cid) AS id,
    tbl_desc.iid_id AS iid_id,
    tbl_desc.cid_id AS cid_id,
    tbl_desc.cs AS a_better_name,
    tbl_char.cid AS something_descriptive,
    tbl_char.charname AS name
FROM tbl_desc,tbl_char 
WHERE tbl_desc.cid_id = tbl_char.cid;
完成后,在Django中,您的模型可能如下所示:

class QryDescChar(models.Model):
    iid_id = models.ForeignKey('WhateverIidIs', related_name='+',
                                db_column='iid_id', on_delete=models.DO_NOTHING)
    cid_id = models.ForeignKey('WhateverCidIs', related_name='+',
                                db_column='cid_id', on_delete=models.DO_NOTHING)
    a_better_name = models.CharField(max_length=10)
    something_descriptive = models.IntegerField()
    name = models.CharField(max_length=50)

    class Meta:
        managed = False
        db_table = 'qry_desc_char'
您不需要id列名末尾的_id部分,因为您可以在Django模型上声明列名,使用更具描述性的db_column参数,正如我前面所做的那样,但这里我仅使用它来防止Django向cid_id和iid_id的末尾添加另一个_id,这会给代码增加零语义值。另外,请注意on_delete参数。Django在级联删除时会做自己的事情,在一个有趣的数据模型上,您不需要这样做——而在视图方面,您只会得到一个错误和一个中止的事务。在Django 1.5之前,您必须对其进行修补,使DO_NOTHING实际上意味着DO NOTHING-否则,它仍将尝试在执行删除周期之前不必要地查询和收集所有相关对象,并且查询将失败,从而停止整个操作

顺便说一句,就在前几天