Dal.autocomplete и AutocompleteFilter не работают в модели с внешним ключом к себе не работают на сайте администратора

Я хочу сделать фильтр категорий по родительской категории, я использую модель и для родительской категории я связал ее с собой.
модель:

class Category(models.Model):
    name = models.CharField(max_length=100)
    parent = models.ForeignKey(
        "self", on_delete=models.CASCADE, null=True, blank=True, related_name="childs"
    )
    description = models.TextField(null=True, blank=True)
    is_adult = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

in admin.py :

class ParentCategoryFilter(AutocompleteFilter):
    title = "By parent category"
    field_name = "parent"
    autocomplete_url = "parent-category-autocomplete"
    is_placeholder_title = True


class CategoryAdmin(admin.ModelAdmin):
    search_fields = ["name"]
    autocomplete_fields = ["parent"]
    fieldsets = (
        (
            _("Details"),
            {
                "fields": (
                    "name",
                    "parent",
                    "description",
                ),
            },
        ),
    )
    list_display = (
        "name",
        "parent",
    )
    list_filter = [ParentCategoryFilter]


admin.site.register(Category, CategoryAdmin)

и views.py, где определено ParentCategoryFilter:

class ParentCategoryAutocompleteView(autocomplete.Select2QuerySetView):
    permissions = [
        "CategoryView",
    ]

    def get_queryset(self):
        qs = Category.objects.filter(parent__isnull=True)
        if self.q:
            qs = qs.filter(Q(name__istartswith=self.q))
        return qs

проблема в том, что в фильтре я получаю имя категории ребенка. Я не знаю, в чем проблема.

Если вы не используете, не вызываете и не представляете имя по умолчанию объекта модели категории где-либо еще. Одной простой модификацией будет добавление к модели строкового имени по умолчанию.

class Category(models.Model):
    name = models.CharField(max_length=100)
    parent = models.ForeignKey(
        "self", on_delete=models.CASCADE, null=True, blank=True, related_name="childs"
    )
    description = models.TextField(null=True, blank=True)
    is_adult = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        if self.parent != None:
            return self.parent.name
        else:
            return self.name

Это быстрое и грязное решение. Если вы не можете использовать это решение, я буду изучать этот вопрос дальше.

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