Фильтрация набора запросов в инлайн-объекте в Django Admin

На конкурс представлено приложение инвентаризации проекта электронной коммерции. Как и ожидалось, есть модель Product. В попытке нормализовать схему БД, я создал эти дополнительные модели:

  • ProductType (отношение ForeignKey в Product)
  • ProductSpecification (FK в ProductType)
  • ProductInventory (с FK в Product)
  • ProductSpecificationValue (FK в ProductSpecification и ProductInventory)

Надеюсь, это имеет смысл - каждый ProductType имеет много продуктов, а также много спецификаций.

ProductInventory (предложения лучшего названия приветствуются), с FK к продукту, представляет собой модель с полями SKU и количества. И самое интересное - она имеет отношение ManyToMany к ProductSpecification, через ProductSpecificationValue.

Теперь часть, в которой я потерялся, это добавление всего этого в Django Admin сайта.

Я могу создавать ProductTypes и Products без проблем, а ProductTypeAdmin имеет inline для добавления этих спецификаций:.

@ admin.register(ProductType) class ProductTypeAdmin(admin.ModelAdmin): inlines = [ ProductSpecificationInline, ]

Проблема начинается, когда я пытаюсь добавить сущность ProductInventory. Поскольку она связана с определенным ProductType, я хочу ограничить выбор строк только теми, которые относятся к тому же ProductType.

class ProductSpecificationValueInline(admin.TabularInline): model = ProductSpecificationValue

def get_formset(self, request, obj=None, **kwargs):  # obj is always the current Product
    print(f">>>>>>>>>>>>>>>>>>>>>> get_formset on PSVI")
    print(f"obj: {obj}")
    print(f"kwargs: {kwargs}")

    fset = super().get_formset(request, obj, **kwargs)
    assert fset is not None
    print(f"fset dir: {dir(fset)}")
    # qs = fset.get_queryset(self)
    # print(f"qs: {qs}")
    return fset

печать 'dir(fset)' показывает, что функция 'get_queryset' доступна - но когда я пытаюсь вызвать ее, я получаю ошибку:

File "/home/devuser/.pyenv/versions/venv38/lib/python3.8/site-packages/django/forms/models.py", line 744, in get_queryset
'ProductSpecificationValueInline' object has no attribute 'queryset'

Я знаю, что мне нужен queryset, прикрепленный к выпадающему списку ProductSpecifications, чтобы я мог фильтровать объекты ProductSpecification по ProductType, который доступен в 'obj'. Но я полагаю, что я не переопределяю правильный метод ModelAdmin (или его подкласса admin.TabularInline)? Так что пока что у меня stcu со всеми Specs для всех Types отображается.

Ну, спасибо за ваше время; если вы хотите посмотреть admin.py/models.py, вот они

Вернуться на верх