在管理中显示聚合数据 changelist_view
show aggragated data in admin changelist_view
我有一个跟踪用户搜索的应用程序。 table 目前看起来像这样:
我想改变的是视图。我不想 group/aggregate/annotate 基于 Search Term
列的视图并保留每个搜索词的最新日期。当用户在搜索栏中输入相同的术语时,列 User searches
正在更新,因此我不需要保留所有记录。我只需要最新的。
我尝试在管理模型中使用 distinct()
和 annotate()
更新查询集,但没有成功。
换句话说,我想在 table 中有 1 个具有最新日期(Searched on
列)的唯一术语。
下面是我的代码:
models.py
class SearchQueryTracker(models.Model):
id = models.AutoField(primary_key=True)
author = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL, unique=False)
total_results = models.IntegerField('Search results', default=0)
total_searches = models.IntegerField('User searches', default=0)
search_term = models.CharField(max_length=1000, blank=True, null=True)
searched_on = models.DateTimeField('searched on', default=timezone.now)
views.py
@login_required
def SearchViewFBV(request):
query = request.GET.get('q')
query_list = request.GET.get('q', None).split()
query_list_count = len(query_list)
user = User.objects.get(email=request.user.email)
find_duplicate_results = SearchQueryTracker.objects.filter(search_term=query).update(total_searches=F('total_searches') + 1)
....
search_tracker = SearchQueryTracker()
search_tracker.total_searches = find_duplicate_results
search_tracker.author = user
search_tracker.search_term = query
search_tracker.save()
admin.py
class SearchQueryTrackerAdmin(ImportExportModelAdmin):
list_display = ('search_term', 'author', 'total_results', 'total_searches', 'searched_on')
readonly_fields = list_display
list_display_links = ('search_term', )
search_fields = ('search_term', )
def queryset(self, request):
qs = super(SearchQueryTrackerAdmin, self).queryset(request)
qs = qs.order_by('-searched_on',).distinct('search_term') # not working
# qs = qs.annotate(Count('searched_on')) # not working
return qs
admin.site.register(SearchQueryTracker, SearchQueryTrackerAdmin)
如有任何帮助或建议,我们将不胜感激。
不必每次都在 SearchViewFBV
上创建新的 SearchQueryTracker
,您可以使用 get_or_create
方法检索 SearchQueryTracker
(如果存在),否则创建它.
@login_required
def SearchViewFBV(request):
query = request.GET.get('q')
query_list = request.GET.get('q', None).split()
query_list_count = len(query_list)
user = User.objects.get(email=request.user.email)
search_tracker, created = SearchQueryTracker.objects.get_or_create(
search_term=query, author=user,
defaults={'total_searches': 1} # If it is created, assign the total_searches so you don't have to save afterwards
)
if not created:
search_tracker.total_searches += 1
search_tracker.save()
为避免 MultipleObjectsReturned
异常,您需要先清除数据库中的所有重复项。
我有一个跟踪用户搜索的应用程序。 table 目前看起来像这样:
我想改变的是视图。我不想 group/aggregate/annotate 基于 Search Term
列的视图并保留每个搜索词的最新日期。当用户在搜索栏中输入相同的术语时,列 User searches
正在更新,因此我不需要保留所有记录。我只需要最新的。
我尝试在管理模型中使用 distinct()
和 annotate()
更新查询集,但没有成功。
换句话说,我想在 table 中有 1 个具有最新日期(Searched on
列)的唯一术语。
下面是我的代码:
models.py
class SearchQueryTracker(models.Model):
id = models.AutoField(primary_key=True)
author = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL, unique=False)
total_results = models.IntegerField('Search results', default=0)
total_searches = models.IntegerField('User searches', default=0)
search_term = models.CharField(max_length=1000, blank=True, null=True)
searched_on = models.DateTimeField('searched on', default=timezone.now)
views.py
@login_required
def SearchViewFBV(request):
query = request.GET.get('q')
query_list = request.GET.get('q', None).split()
query_list_count = len(query_list)
user = User.objects.get(email=request.user.email)
find_duplicate_results = SearchQueryTracker.objects.filter(search_term=query).update(total_searches=F('total_searches') + 1)
....
search_tracker = SearchQueryTracker()
search_tracker.total_searches = find_duplicate_results
search_tracker.author = user
search_tracker.search_term = query
search_tracker.save()
admin.py
class SearchQueryTrackerAdmin(ImportExportModelAdmin):
list_display = ('search_term', 'author', 'total_results', 'total_searches', 'searched_on')
readonly_fields = list_display
list_display_links = ('search_term', )
search_fields = ('search_term', )
def queryset(self, request):
qs = super(SearchQueryTrackerAdmin, self).queryset(request)
qs = qs.order_by('-searched_on',).distinct('search_term') # not working
# qs = qs.annotate(Count('searched_on')) # not working
return qs
admin.site.register(SearchQueryTracker, SearchQueryTrackerAdmin)
如有任何帮助或建议,我们将不胜感激。
不必每次都在 SearchViewFBV
上创建新的 SearchQueryTracker
,您可以使用 get_or_create
方法检索 SearchQueryTracker
(如果存在),否则创建它.
@login_required
def SearchViewFBV(request):
query = request.GET.get('q')
query_list = request.GET.get('q', None).split()
query_list_count = len(query_list)
user = User.objects.get(email=request.user.email)
search_tracker, created = SearchQueryTracker.objects.get_or_create(
search_term=query, author=user,
defaults={'total_searches': 1} # If it is created, assign the total_searches so you don't have to save afterwards
)
if not created:
search_tracker.total_searches += 1
search_tracker.save()
为避免 MultipleObjectsReturned
异常,您需要先清除数据库中的所有重复项。