首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在admin changelist_view中显示增益数据

在admin changelist_view中显示增益数据
EN

Stack Overflow用户
提问于 2022-04-11 16:00:14
回答 1查看 54关注 0票数 0

我有一个应用程序,我跟踪用户的搜索。当前的表如下所示:

我想要改变的是观点。我希望基于Search Term列对视图进行分组/聚合/注释,并保留每个搜索项的最新日期。当用户在搜索栏中放置相同的术语时,列User searches将被更新,因此我不需要保存所有记录。我只需要最新的。

我试图在管理模型中使用distinct()annotate()更新queryset,但没有成功。

换句话说,我希望在表中有一个具有最新日期(Searched on列)的唯一术语。

下面是我的代码:

models.py

代码语言:javascript
复制
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

代码语言:javascript
复制
@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

代码语言:javascript
复制
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)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-11 16:26:52

与每次在SearchViewFBV上创建新的SearchViewFBV不同,您可以使用get_or_create方法检索存在的SearchQueryTracker,或者以其他方式创建SearchQueryTracker

代码语言:javascript
复制
@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异常,首先需要清除数据库中的所有重复项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71830887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档