Показывать агрегированные данные в просмотре списка_изменений администратора

У меня есть приложение, в котором я отслеживаю поисковые запросы пользователей. В настоящее время таблица выглядит следующим образом:

enter image description here

Что я хочу изменить, так это представление. Я хотел бы сгруппировать/собрать/аннотировать представление на основе столбца Search Term и сохранить последнюю дату каждого поискового термина. Колонка User searches обновляется, когда пользователь вводит тот же термин в строку поиска, поэтому мне нет необходимости хранить все записи. Мне нужна только самая последняя.

Я пытался обновить набор запросов с помощью distinct() и annotate() в модели администратора, но безуспешно.

Другими словами, я хочу иметь 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)

   

Любая помощь или совет будут оценены по достоинству.

Вместо того, чтобы создавать новую SearchQueryTracker каждый раз на SearchViewFBV, вы можете использовать метод 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, вам нужно сначала очистить вашу базу данных от всех дубликатов.

Вернуться на верх