Обновление поля в списке изменений администратора

У меня есть модель товаров, и я хочу вывести список на админку сайта с возможностью изменения порядка.

class Product(models.Model):
    name = models.CharField(max_length=500)
    is_active = models.BooleanField(default=True)
    category = models.ForeignKey(
        "categories.Category", on_delete=models.CASCADE, related_name="products"
    )
    description = models.TextField(null=True, blank=True)
    ingredient = models.TextField(null=True, blank=True)
    order = models.PositiveIntegerField(default=0)
    rank = models.PositiveIntegerField(default=0)
    price = models.DecimalField(max_digits=10, decimal_places=2, default=0)

    objects = ProductManager()

    class Meta:
        verbose_name_plural = _("Products")
        verbose_name = _("Product")
        ordering = ["order"]

    def __str__(self) -> typing.Text:
        return self.name

Я решил упорядочить модель по полю order, которое нельзя редактировать на странице администратора, поэтому я хочу скопировать его значение в поле rank, которое я хочу сделать редактируемым на странице администратора, и когда я сохраню изменения, сделанные в rank, я хочу переопределить значения order новым значением из rank. Вот как я регистрирую модель:

class ProductAdmin(SortableAdminMixin, TranslationAdmin):
    inlines = [ImagesInline, NutritionsInline]
    search_fields = ["name", "description"]
    autocomplete_fields = ["category", "brand", "manufacturer"]
    fieldsets = (
        (
            _("Details"),
            {
                "fields": (
                    "is_active",
                    "name",
                    "price",
                    "category",
                    "description",
                ),
            },
        ),
        (
            _("Product Info"),
            {
                "fields": ("ingredient",),
            },
        ),
    )
    list_display = ("order", "rank", "name", "category")
    list_editable = ["rank"]

Я пытался переопределить get_queryset, но это не сработало. У вас есть идеи, как это сделать?

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