Django:在管理页面 TabularInline 上具有一对多关系的多个模型
Django: multiple models with one-to-many relation on admin page TabularInline
我在现有数据库中有多个模型,它们都与另一个模型存在多对一关系。例如:
class Collection(models.Model):
start = models.DateTimeField()
end = models.DateTimeField(blank=True, null=True)
class Meta:
managed = False
db_table = 'Program'
class ItemA(models.Model):
collection = models.ForeignKey(
'Collection', models.CASCADE, db_column='Collection_id')
...
class Meta:
managed = False
db_table = 'ItemA'
class ItemB(models.Model):
collection = models.ForeignKey(
'Collection', models.CASCADE, db_column='Collection_id')
...
class Meta:
managed = False
db_table = 'ItemB'
我想做的是在集合模型的管理页面上将这些模型显示在一个 TabularInline
中。我还希望能够过滤模型。这可能没有数据库中的继承吗? (我不想添加一般项目 table)。在文档中,我只能找到如何将 TabularInline 用于单个模型。所以我的问题基本上是:解决这个问题的最佳方法是什么?是否可以定义某种视图模型 dat 不在数据库中,但可用于显示 TabularInline
中的所有项目?
我最终在我的数据库中使用了一个视图,这意味着我不需要添加 table。在 Django 中,我创建了一个模型来处理视图:
class Item(models.Model):
collection = models.ForeignKey(
'Collection', models.CASCADE, db_column='Collection_id')
...
class Meta:
managed = False
db_table = 'Item' # This is not a table, but a view
我使用多个 SELECT
语句和 UNION
:
定义了视图
CREATE OR REPLACE VIEW `Item` AS
SELECT CONCAT('itemA_',id) as id, name, ... FROM ItemA
UNION
SELECT CONCAT('itemB_',id) as id, name, ... FROM ItemB
...
我在现有数据库中有多个模型,它们都与另一个模型存在多对一关系。例如:
class Collection(models.Model):
start = models.DateTimeField()
end = models.DateTimeField(blank=True, null=True)
class Meta:
managed = False
db_table = 'Program'
class ItemA(models.Model):
collection = models.ForeignKey(
'Collection', models.CASCADE, db_column='Collection_id')
...
class Meta:
managed = False
db_table = 'ItemA'
class ItemB(models.Model):
collection = models.ForeignKey(
'Collection', models.CASCADE, db_column='Collection_id')
...
class Meta:
managed = False
db_table = 'ItemB'
我想做的是在集合模型的管理页面上将这些模型显示在一个 TabularInline
中。我还希望能够过滤模型。这可能没有数据库中的继承吗? (我不想添加一般项目 table)。在文档中,我只能找到如何将 TabularInline 用于单个模型。所以我的问题基本上是:解决这个问题的最佳方法是什么?是否可以定义某种视图模型 dat 不在数据库中,但可用于显示 TabularInline
中的所有项目?
我最终在我的数据库中使用了一个视图,这意味着我不需要添加 table。在 Django 中,我创建了一个模型来处理视图:
class Item(models.Model):
collection = models.ForeignKey(
'Collection', models.CASCADE, db_column='Collection_id')
...
class Meta:
managed = False
db_table = 'Item' # This is not a table, but a view
我使用多个 SELECT
语句和 UNION
:
CREATE OR REPLACE VIEW `Item` AS
SELECT CONCAT('itemA_',id) as id, name, ... FROM ItemA
UNION
SELECT CONCAT('itemB_',id) as id, name, ... FROM ItemB
...