在管理changelist_view中显示聚合数据

发布于 2025-01-20 13:16:42 字数 2287 浏览 2 评论 0原文

我有一个应用程序,可以在其中跟踪用户搜索。该表当前看起来像这样:

”在此处输入图像描述”

我想更改的是视图。我会根据搜索术语列进行分组/汇总/注释视图,并保留每个搜索词的最新日期。当用户将相同的术语放在搜索栏中时,列用户搜索正在更新,因此我无需保留所有记录。我只需要最新的一个。

我尝试使用dintive()Annotate()在管理模型中更新QuerySet,但没有成功。

换句话说,我想在表中有1个唯一的术语,其中最新日期(列搜索<代码>)。

以下是我的代码:

model.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 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)

   

任何帮助或建议将不胜感激。

I have an app where I am tracking user searches. The table currently looks like this:

enter image description here

What I want to change is the view. I'd dlike to group/aggregate/annotate the view based on Search Term column and keep the latest date of each search term. The column User searches is being updated when user puts the same term in the search bar so there is no need for me to keep all records. I just need the latest one.

I tried to update queryset using distinct() and annotate() in admin model but with no success.

In other words I want to have 1 unique term in the table with the latest date (Searched on column).

Below is my code:

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)

   

Any help or advice will be appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

淡笑忘祈一世凡恋 2025-01-27 13:16:42

您可以在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()

为了避免MutteranObjectStsReturned例外,您将需要首先清洁所有重复项的数据库。

Instead of creating a new SearchQueryTracker each time on SearchViewFBV, you can use the get_or_create method to retrieve the SearchQueryTracker if it exists, or create it otherwise.

@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()

To avoid MultipleObjectsReturned exception you will need to clean your database of all duplicates first.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文