Есть таблицы Product
и Transaction
. В Product
admin есть поле, которое показывает, сколько транзакций было создано с этим продуктом.Как фильтровать объекты по значениям посторонних объектов в Django admin
Теперь я хочу отфильтровать период времени, в котором были созданы эти транзакции. Например, на прошлой неделе было 30 транзакций, но за последний месяц - 100.
class Transaction(models.Model):
created = models.DateTimeField()
product = models.ForeignKey('Product')
class Product(models.Model):
name = models.CharField()
def num_of_trans(self):
return Transaction.objects.filter(created="""DATE_VALUE_HERE""").filter(product=self.id).count()
Я пытался настроить queryset
в классе, который простирается SimpleListFilter
, однако мне не удалось заставить его работать.
Еще одна вещь, о которой я думал, заключается в добавлении дополнительного параметра в функцию num_of_trans
, но, похоже, нет способа передать этот параметр при использовании фильтра.
Буду признателен за любые советы.
EDIT
class MyListFilter(admin.SimpleListFilter):
title = _('period')
parameter_name = 'period'
def lookups(self, request, model_admin):
return (
('7', _('last week')),
('30', _('last month')),
)
def queryset(self, request, queryset):
period = timezone.now() + timedelta(days=self.value()))
return queryset.filter(transactions__gte=period)
# of course it won't work, but represents the idea
Обновите свой вопрос расширенным классом SimpleListFilter. –
Я не уверен, что это сработает, но изменение num_of_trans в свойство может позволить вам использовать его в list_filter. – vsachar