Фильтрация набора запросов в инлайн-объекте в 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, вот они