问题描述
模型.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 (将#修改为@)