Как вывести в админке все поля связанных М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]
Не могу решить две задачи.
- На странице редактирования версии справочника (это класс
VersionAdmin) надо добавить возможность заполнить элементы справочника - На странице редактирования элементов справочника (это класс
ElementAdmin) надо добавить возможность выбрать значение из спискаверсия-справочник(то есть как бы сдвоенный список).
Через соединительную таблицу ElementVersion получается с использованием TabularInline выводить только foreign key. А мне хочется, чтобы на странице версии дополнительно отображались значения элементов. То есть как-то надо выводить нужные мне поля из таблицы Element. Понимаю, что надо делать как-то через связку Version - ElementVersion - Element. Но не могу додуматься.
И не ясно, как делать сдвоенный список версия-справочник на странице элементов. Делать запрос через prefetch_related? Переопределять метод __str__(), чтобы он вернул {self.version} + {self.refbook_id.name}?
В общем, буду раз любым подсказкам ))