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-否则,它仍将尝试在执行删除周期之前不必要地查询和收集所有相关对象,并且查询将失败,从而停止整个操作
顺便说一句,就在前几天