Django: доступ к экземпляру модели из ModelAdmin?

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

class Order(models.Model):
    ordernumber = models.AutoField(primary_key=True)
    parent_order = models.ForeignKey('self', null=True, blank=True, related_name='child_orders')
    # .. other fields not relevant here

Я зарегистрировал класс OrderAdmin для сайта администратора. Для подробного просмотра я включилparent_order вfieldsets приписывать. Конечно, по умолчанию это перечисляет все заказы в окне выбора, но это не желаемое поведение. Вместо этого для заказов, которые не имеют родительского заказа (то есть не были отделены от другого заказа;parent_order NULL / None), никакие заказы не должны отображаться. Для заказов, которые были разделены, должен отображаться только один родительский заказ.

Доступен довольно новый метод ModelAdmin,formfield_for_foreignkey, это кажется идеальным для этого, так как набор запросов может быть отфильтрован внутри него. Представьте, что мы смотрим на подробное представление заказа № 11234, который был отделен от заказа № 11208. Код ниже

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == 'parent_order':
        # kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=11234)
        return db_field.formfield(**kwargs)
    return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

Комментируемая строка работает при запуске в оболочке Python, возвращая набор запросов из одного элемента, содержащий заказ # 11208 для # 11234 и все другие заказы, которые могли быть отделены от него.

Конечно, мы не можем жестко закодировать номер заказа там. Нам нужна ссылка наordernumber поле экземпляра заказа, на странице которого мы смотрим. Нравится:

kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=?????)

Я не нашел рабочего способа заменить ????? со ссылкой на «текущий» экземпляр Order, и я выкопал довольно глубоко.self внутриformfield_for_foreignkey ссылается на экземпляр ModelAdmin, и хотя он имеетmodel атрибут, это не экземпляр модели заказа (это ссылка на ModelBase; self.model () возвращает экземпляр, но его порядковый номер - None).

Одним из решений может быть получение номера заказа из request.path (/ admin / orders / order / 11234 /), но это действительно ужасно. Я действительно хочу, чтобы был лучший способ.

Ответы на вопрос(3)

Ваш ответ на вопрос