微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django - 在具有多级 prefetch_related 的 django admin get_queryset 方法中添加自定义字段

如何解决Django - 在具有多级 prefetch_related 的 django admin get_queryset 方法中添加自定义字段

我有以下型号。城市中有站点。停靠点之间有连接。

模型.PY

class City(models.Model):
    pass

class Stop(models.Model):
    city = models.ForeignKey(City,related_name='stops')

class Connection(models.Model):
    origin = models.ForeignKey(Stop,related_name='origin_connections')
    destination = models.ForeignKey(Stop,related_name='destination_connections')

在 City 的管理员概览中,我希望有可点击的自定义字段显示连接数以及这些连接的链接

我需要 prefetch_related 来防止重复查询。 Prefetch_related 将加载持续时间从 20 秒减少到 1 秒。

管理员.PY

class CityAdmin(TranslationAdmin):
    list_display = ["get_connection_count"]

    def get_queryset(self,request):
        queryset = super().get_queryset(request)

        queryset = queryset.prefetch_related('stops__origin_connections','stops__destination_connections')

        return queryset

    def get_connection_count(self,obj):
        """
        City has 'stops' that,in turn,have 'origin_connections' and 'destination_connections'.
        Connection count for the city will be the count of connections that either start (origin) or end (destination) in 'stops'
        """
        connections = []
        for stop in obj.stops.all():
            connections.extend(stop.origin_connections.all())
            connections.extend(stop.destination_connections.all())
        connections = list(set(connections))  # to drop duplicates

        connection_count = len(connections)

        url = reverse("admin:loc_connection_changelist")
        if connection_count:
            connections_id_str = ','.join(str(x.id) for x in connections)
            return format_html('<a href="{}?id__in={}">{} Connections </a>',url,connections_id_str,connection_count)
        else:
            return format_html('<a href="{}?id__in=-1">{} Connections </a>',connection_count)

    get_connection_count.short_description = "Connection count"

我想将循环部分从自定义字段移动到 get_queryset() 函数。换句话说,我想注释逗号分隔的 ID 字符串并将其存储为单独的列('connections_ids'),以便我可以这样做:

def get_connection_count(self,obj):
    url = reverse("admin:loc_connection_changelist")
    connection_count = len(obj.connections_ids.split(',')
    if connection_count:
        return format_html('<a href="{}?id__in={}">{} Connections </a>',connection_count)
    else:
        return format_html('<a href="{}?id__in=-1">{} Connections </a>',connection_count)

get_connection_count.short_description = "Connection count"

我只需要网址的 id。我希望我可以使用这样的 url,但这过滤了我想要联合的过滤约束的交集:

admin/loc/connection/?origin__city_id__exact={}&destination__city_id__exact={}

如果有任何建议,我将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。