【问题标题】:Iterating Through a Database Django遍历数据库 Django
【发布时间】:2019-11-20 15:33:47
【问题描述】:

我的数据库中有一个名为 Item 的模型。这是模型

class Item(models.Model):
    item_title = models.CharField("Item title: ", max_length=50)
    item_description = models.CharField("Item description: ", max_length=200)
    starting_price = models.FloatField( default = 0)
    picture = models.ImageField(upload_to = 'gallery')
    finishTime = models.DateTimeField("Finish time: ")
    ownerID = models.ForeignKey(User, on_delete = models.CASCADE)
    higestBid = models.FloatField()
    highestBidderID = models.IntegerField(blank=True, default=-1)
    active = models.BooleanField(default = True)

我想在 views.py 中创建一个函数,它将检查数据库中每个项目的“活动”字段。我怎样才能做到这一点?我试过这样做:

items = list(Item.object.values())
for i in range(items):
  print(item[i].active)

但是它不起作用。任何帮助表示赞赏

【问题讨论】:

  • 为什么要使用values()? 为什么要调用list?为什么要使用range?你为什么使用索引?为什么不只是for item in Item.objects.all(): print(item.active)

标签: python django database sqlite


【解决方案1】:

您应该遍历查询集本身:

for item in Item.objects.all():
  print(item.active)

不要使用.values() [Django-doc]。您应该只在某些特定情况下使用它,例如对某个值进行分组。通过使用对象,您仍将使用模型对象,因此您在该对象上添加的某些逻辑仍然可以访问。

此外,通常最好使用list(..)QuerySet 是惰性的,因此如果您以某种方式从不迭代它,那么它将不会进行查询。此外,您还可以对现有的QuerySet 进行额外过滤。

【讨论】:

  • 如果不需要,不要使用 all(),它会使你的数据库过载。
  • @Unknown123:您不能迭代 .objectsManager,而不是 QuerySet。你至少需要.filter(..).all(..)等来构造一个QuerySet。正如 Python 之禅 所说:显式优于隐式
猜你喜欢
  • 2016-01-09
  • 2018-03-06
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
相关资源
最近更新 更多