Фильтр 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"

А вот как это выглядит:

enter image description here

Но строка + 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 к вашей модели

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