Django Admin | Фильтр выпадающего списка Many to Many на основе выбора отношения по внешнему ключу

Я пытаюсь понять лучший способ горизонтальной фильтрации в Django Admin на модели, которая имеет отношение Many to Many. Цель состоит в том, чтобы в секции Inline, когда один выпадающий список заполнен, следующий за ним выпадающий список, который имеет связь внешнего ключа с первым выпадающим списком, был отфильтрован.

Существуют TypeSet и TypeValues, TypeSet имеет множество TypeValues например, если тип TypeSet - "дерево", то типы TypeValue будут ["дуб", "вишня", "орех"]

Затем эти значения типа образуют отношения "многие-ко-многим" с "Вещью" (вместе с включенным TypeSet_id)

Цель - в ThingTypeInline в Django Admin при создании новой вещи я могу выбрать TypeSet из выпадающего списка, который затем отфильтрует выпадающее TypeValue рядом с ним.

Это будет пользовательская форма?

Модели:

class TypeSet(models.Model):
    """TypeSet to be used to describe data type"""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    type = models.CharField(max_length=255, unique=True)
    .....


class TypeValue(models.Model):
    """TypeValue to be used to describe value in the TypeSet"""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    type = models.CharField(max_length=255)
    type_set = models.ForeignKey(
        TypeSet,
        on_delete=models.CASCADE
    )
    .......

class Thing(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    types = models.ManyToManyField(
        TypeValue, through='ThingType')
   ..........

class ThingType(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    thing = models.ForeignKey(Locale, on_delete=models.CASCADE)
    type_set = models.ForeignKey(TypeSet, on_delete=models.CASCADE)
    type_value = models.ForeignKey(TypeValue, on_delete=models.CASCADE)
    .......

Admin:

class ThingTypeInline(admin.TabularInline):
    model = models.ThingType


class ThingAdmin(admin.ModelAdmin):
    inlines = [
        LocaleTypeInline,
    ]
Вернуться на верх