Django:如何使用 ListView 将最后添加日期添加到查询集中

Django: How to add the last added date to a query set using ListView

我不知道如何创建查询集,以便为 RedirectURL [=47] 中的每个 URL 选择最后一个 URLusage table 条目=] dateaccessed 字段并将其附加到查询结果,类似于我对 num_links 字段所做的。

最终结果是我显示了重定向URL 的列表,其中包含 URLusage table.

中的使用计数和上次使用日期

谢谢。

例如

Link---上次使用---总使用

xxxxx 2020 年 12 月 13 日 22

yyyyy 2020 年 1 月 14 日 2

型号

class RedirectURL(models.Model):
    userid = models.PositiveBigIntegerField(null=True, default=1)
    srcurl = models.CharField(max_length=50, null=True, unique=True)
    active = models.BooleanField(null=True, default=False)

class URLusage(models.Model):
    redirectid = models.ForeignKey(RedirectURL, on_delete=models.CASCADE)       
    dateaccessed = models.DateTimeField(auto_now_add=True, null=True)

查看

class LinksList(LoginRequiredMixin, ListView):
    login_url = "home"
    redirect_field_name = None
    login_required = True
    context_object_name = 'links'
    paginate_by = 30
    template_name = 'yourlinks.html'
    paginate_orphans = 1

    def get_queryset(self):
        return RedirectURL.objects.filter(userid=self.request.user.id, active=True).annotate(num_links=Count('urlusage')).order_by('-id')

    def get_context_data(self,*args, **kwargs):
        try:
            return super(LinksList,self).get_context_data(*args, **kwargs) 
        except Http404:
            self.kwargs['page'] = 1
            return super(LinksList,self).get_context_data(*args, **kwargs)

模板

{% for i in links %}
        <div class="row">
          <div class="col-sm">
            {{ i.srcurl }}      
          </div>
          <div class="col-sm">
            {{ i.last_dateaccessed }}
          </div>
          <div class="col-sm">
            {{ i.num_links }}
          </div>
        </div>
{% endfor %}

我想你需要这样的 queryset:

from django.db.models import Max, Count

qs = RedirectURL.objects.annotate(last_used=Max('urlusage__dateaccessed'), total_used=Count('urlusage'))

这将按 redirect_id 和 returns 您想要的结果对您的网址进行分组。 然后您可以遍历 qs 并显示您的数据:

for rec in qs:
    print(rec.srcurl, rec.last_used, rec.total_used)

或者您可以将 qs 传递给模板上下文,然后在相关模板中使用此数据。

注意:您也可以根据您的要求过滤此 queryset。例如基于用户过滤:

qs = RedirectURL.objects.filter(user=some_user).annotate(last_used=Max('urlusage__dateaccessed'), total_used=Count('urlusage'))

.