【问题标题】:Excluding objects from Django queryset based on recency根据新近度从 Django 查询集中排除对象
【发布时间】:2016-08-09 00:49:52
【问题描述】:

我有一个类似 reddit 的 Django 应用程序,用户可以在其中发布有趣的 url(链接),然后在它们下公开评论。表示这一点的两个数据模型是:

class Link(models.Model):
    description = models.TextField(validators=[MaxLengthValidator(500)])
    submitter = models.ForeignKey(User)
    submitted_on = models.DateTimeField(auto_now_add=True)

class Publicreply(models.Model):
    submitted_by = models.ForeignKey(User)
    answer_to = models.ForeignKey(Link)
    submitted_on = models.DateTimeField(auto_now_add=True)
    description = models.TextField(validators=[MaxLengthValidator(250)])

我如何查询所有Links 至少有1 个或多个publicreply,其次最新的publicreply 不是self.request.user不是?我感觉到以下内容:

Link.objects.filter(publicreply__isnull=False).exclude(**something here**)

请指教!性能也是关键,因此越简单越好!

【问题讨论】:

    标签: django performance django-models django-queryset


    【解决方案1】:

    为了性能和简单性,您可以缓存回复数量和最新回复:

    class Link(models.Model):
        ...
        number_of_replies = models.PositiveIntegerField(default=0)
        latest_reply = models.ForeignKey('myapp.Publicreply', related_name='+', blank=True, null=True, on_delete=models.SET_NULL)
    

    输入回复后,更新对应的link.number_of_replieslink.latest_reply

    查询将是:

    Link.objects.filter(number_of_replies__gte=1)\
                .exclude(latest_reply__user=request.user)
    

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      相关资源
      最近更新 更多