【问题标题】:checking for boolean/null to sort in Django sqlite3检查布尔/空值以在 Django sqlite3 中排序
【发布时间】:2014-06-11 10:16:41
【问题描述】:

我想一次提供一个投票条目,从最新的未投票开始,向下移动到最旧的未投票。如果所有条目都已投票,我想显示一个随机投票的条目。

在 Entry 模型中,我有一个投票布尔值;

模型

class Entry(models.Model):
  text = models.CharField(max_length=15)
  score = models.IntegerField(default=0)
  pub_date = models.DateTimeField('date published')
  voted = models.BooleanField(default=False)
  def __unicode__(self):
    return self.text
  def was_published_recently(self):
    return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
  was_published_recently.admin_order_field = 'pub_date'
  was_published_recently.boolean = True
  was_published_recently.short_description = 'Published recently?'

在条目:视图中,我定义了在表格中显示并用于投票的条目:

观看次数

def index(request):
 context = {
  'latest_entry_list': Entry.objects.order_by('-pub_date')[:10],
  'high_entry_list': Entry.objects.order_by('-score')[:10],
  'low_entry_list': Entry.objects.order_by('score')[:10],
  'voting_entry_list': Entry.objects.filter(voted = False).order_by('-pub_date')[:1],
 }
 return render(request, 'entries/index.html', context);

'voting_entry_list':Entry.objects.filter(voted = False).order_by('-pub_date')[:1],

我称它为投票列表,但它仅包含要显示投票的排序条目。

这将负责显示最新的未投票条目,我知道我需要检查已投票是否为真,在这种情况下显示一个随机条目,但我似乎无法获得正确的语法来执行此操作。我认为对 voted=False 的检查返回 null 可以让我执行 else 函数来选择一个随机条目,但我似乎无法在我的代码中使用它。

有人可以提个建议吗?

【问题讨论】:

  • 你可以两者兼得。然后在index.html 中使用if not voting_entry_list: ...,这样它将显示所有未投票的内容(如果为true,则显示voting_entry_list,因为voting_entry_list 为空)。 else 如果所有输入都已投票,则显示一个随机投票的条目。我不是专家,但对我来说这听起来很合乎逻辑。
  • 这应该可行,而且是有道理的。我想我希望用一行优雅的代码来做到这一点。我会继续努力,但是当我厌倦的时候保留那个:) ....thankx
  • 别担心!很高兴我能帮上忙。

标签: django syntax sqlite null boolean


【解决方案1】:

您可以为Entry 模型定义自定义模型管理器。

class EntryManager(models.Manager): def unvoted_or_random(self): unvoted_entries = self.filter(voted = False).order_by('-pub_date') if unvoted_entries: return unvoted_entries[:1] else: return self.all()[:1] #或任何你想要的东西

然后在您的 Entry 模型中,您可以执行类似的操作。

class Entry(models.Model): ... objects = EntryManager()

然后您可以通过

在视图中获取所需的条目

Entry.objects.unvoted_or_random()

并将其传递到上下文中..

我希望它会有所帮助..

【讨论】:

  • 有趣,我必须明白这一点。谢谢!
  • 如果对您有帮助,请接受答案.. :)
  • 有趣。只要有未投票的我就工作,但一旦全部投票,投票条目就会停留在最后一个投票并停留在那里。
  • 您可以轻松地改变这种行为。在unvoted_or_random 函数中,if 语句的 else 部分处理这种情况。我所做的是,只需选择第一个元素。您可以通过[random_number:random_number +1]选择任意随机数,只要number + 1在列表大小范围内,也可以计算。您可以通过自己的一些技术来选择随机数,也可以使用标准库中的一些方法..
  • 我会继续研究,但我也会研究这样的事情; 'voting_entry_list': Entry.objects.extra(select={"voting":"COALESCE(-pub_date, voted)"}, order_by=["-voting"])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 2019-03-14
  • 2020-07-08
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
相关资源
最近更新 更多