Django: несколько моделей с отношением один-ко-многим на странице администратора TabularInline - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть несколько моделей в существующей базе данных, которые имеют отношение «многие к одному» с другой моделью. Например:

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 на странице администрирования модели Collection. Я также хочу иметь возможность фильтровать модели. Возможно ли это без наследования в базе данных? (Я не хочу добавлять общую таблицу предметов). В документации я могу найти только то, как вы можете использовать TabularInline для одной модели. Итак, мой вопрос в основном: каков наилучший подход для решения этой проблемы? Возможно ли определить некую модель представления, которой нет в базе данных, но которую можно использовать для отображения всех элементов в TabularInline?

1 Ответ

0 голосов
/ 28 апреля 2020

Я закончил с использованием представления в моей базе данных, то есть мне не нужно было добавлять таблицу. В 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
...
...