Как вывести в админке все поля связанных М2М моделей для редактирования, а не только Foreign key?

Помогите, пожалуйста, с выводом в админке полей связанных М2М моделей. Модели такие:

class Refbook(models.Model):    
    code = models.CharField(max_length=100, unique=True, verbose_name='refbook code')
    name = models.CharField(max_length=300, verbose_name='refbook name')
    description = models.TextField()

    def __str__(self):
        return self.name


class Version(models.Model):
    refbook_id = models.ForeignKey('Refbook',
                                   on_delete=models.CASCADE,
                                   related_name='versions',
                                   verbose_name='refbook name')
    version = models.CharField(max_length=50, verbose_name='refbook version')
    date = models.DateField(verbose_name='start date')

    def __str__(self):
        return self.version

    class Meta:        
        unique_together = [['refbook_id', 'version'], ['refbook_id', 'date']]


class Element(models.Model):
    version_id = models.ManyToManyField('Version',
                                        through='ElementVersion',
                                        verbose_name='id_version')
    code = models.CharField(max_length=100, unique=True, verbose_name='element's code')
    value = models.CharField(max_length=300, verbose_name='element's value')

    def __str__(self):
        return self.code


class ElementVersion(models.Model):
    version = models.ForeignKey(Version,
                                on_delete=models.CASCADE,
                                verbose_name='version')
    element = models.ForeignKey(Element,
                                on_delete=models.CASCADE,
                                verbose_name='element')

    class Meta:
        unique_together = ('version', 'element')

В файле admin.py следующий код:

from .models import Refbook, Version, Element, ElementVersion


class VersionInline(admin.StackedInline):
    model = Version
    fields = ['date']
    readonly_fields = ('date',)

    def has_add_permission(self, request, obj=None):
        return False

    def has_delete_permission(self, request, obj=None):
        return False


@admin.register(Refbook)
class RefbookAdmin(admin.ModelAdmin):
    list_display = ['id', 'code', 'name', 'get_last_version', 'get_date_version']
    inlines = [VersionInline]

    def get_last_version(self, obj):
        return obj.versions.values_list('version').last()
    get_last_version.short_description = "last version"

    def get_date_version(self, obj):
        return obj.versions.values_list('date').last()
    get_date_version.short_description = "start date"


class ElementVersionInline(admin.TabularInline):
    model = ElementVersion
    extra = 0


@admin.register(Version)
class VersionAdmin(admin.ModelAdmin):
    list_display = ['get_code_refbook', 'refbook_id', 'version', 'date']
    inlines = [ElementVersionInline]

    def get_code_refbook(self, obj):
        return obj.refbook_id.code
    get_code_refbook.short_description = 'refbook code'


@admin.register(Element)
class ElementAdmin(admin.ModelAdmin):
    list_display = ['id', 'code', 'value']
    inlines = [ElementVersionInline]

Не могу решить две задачи.

  1. На странице редактирования версии справочника (это класс VersionAdmin) надо добавить возможность заполнить элементы справочника
  2. На странице редактирования элементов справочника (это класс ElementAdmin) надо добавить возможность выбрать значение из списка версия-справочник (то есть как бы сдвоенный список).

Через соединительную таблицу ElementVersion получается с использованием TabularInline выводить только foreign key. А мне хочется, чтобы на странице версии дополнительно отображались значения элементов. То есть как-то надо выводить нужные мне поля из таблицы Element. Понимаю, что надо делать как-то через связку Version - ElementVersion - Element. Но не могу додуматься.

И не ясно, как делать сдвоенный список версия-справочник на странице элементов. Делать запрос через prefetch_related? Переопределять метод __str__(), чтобы он вернул {self.version} + {self.refbook_id.name}?

В общем, буду раз любым подсказкам ))


Ответы (0 шт):