Фильтр urlencode с 2-уровневым обратным отношением
У меня есть эти models:
class Issuer(models.Model):
name = models.CharField()
@property
def investor_count(self):
return Investment.objects.filter(offering__issuer_id=self.pk).count() or 0
def __str__(self):
return self.name
class Offering(models.Model):
issuer = models.ForeignKey(Issuer, on_delete=models.CASCADE)
name = models.CharField()
def __str__(self):
return self.name
class Investment(models.Model):
offering = models.ForeignKey(Offering, on_delete=models.CASCADE)
name = models.CharField()
def __str__(self):
return self.name
И я хочу отобразить в представлении списка Issuer количество инвестиций, которые у него есть. Вот функция, которую я сейчас использую,
# link investments to page
def view_investments_link(self, obj):
count = obj.investor_count
url = (
reverse("admin:crowdfunding_investment_changelist")
+ "?"
+ urlencode({"issuer__id": f"{obj.id}"})
)
return format_html('<a href="{}">{} Investment(s)</a>', url, count)
view_investments_link.short_description = "NUMBER OF INVESTMENTS"
А вот как это выглядит:
Но строка + urlencode({"issuer__id": f"{obj.id}"}) не работает. Она изменяет мои url на http://localhost:8000/app/investment/?e=1. Есть ли способ фильтровать Investments с помощью issuer_id?
если вы хотите фильтровать инвестиции по issuer_id, вы можете просто изменить list_filter в ModelAdmin следующим образом
@admin.register(Investment)
class Investment_Register(admin.ModelAdmin):
list_filter = ["offering__issuer__id"]
и затем передайте идентификатор эмитента в URL следующим образом http://localhost:8000/app/investment/?offering__issuer__id={id-issuer}
примечание: если вы выдаете ошибку, подобную этой
(admin.E116) The value of 'list_filter[0]' refers to 'offering__issuer__id', which does not refer to a Field.
минимально добавьте поле id к вашей модели
