【问题标题】:Does further queryset manipulations change original queryset进一步的查询集操作是否会改变原始查询集
【发布时间】:2012-02-13 10:59:18
【问题描述】:

如果我们有一个查询集说

eventset=Event.objects.filter(eventdate=date)

然后如果我对查询集对象做这样的事情,它会是正确的逻辑还是会被操纵事件集?

for event in eventset.order_by('-likes'):
    if event.venue in venuerankings:
        venuerankings.append[event.venue]

以上部分代码是否改变了'eventset'中对象的顺序?

代码的相关部分。

totalvenues=len(Venues.objects.all()))
    events=[[''] * totalvenues for row in range(24)]
eventset=Event.objects.filter(eventdate=date)
venuerankings=[]
for event in eventset.order_by('-likes'):
    if event.venue in venuerankings:
        venuerankings.append[event.venue]
for venueno,venue in enumerate(venuerankings):
    for event in eventset.filter[venue=venue]:
        events[event.time][venueno]=event

【问题讨论】:

  • 我没有对此投反对票,但是您的语法没有问题吗?我想你的意思是venueranking.append(event.venue)。另外,你想在这里实现什么?你想要events 是什么?输入和输出的示例会很有帮助。
  • 不知道为什么它被否决,对我来说似乎是一个合理的问题。我的理解是 eventset 可以像这样 eventset = eventset.order_by('-likes') 改变,但只是像你一样使用它不会影响它。
  • 这是我正在尝试处理的代码 dpaste.com/702412 我还没有完成代码的其他部分,所以我无法发布 ant i/ps 和 o/ps。如果您发现该代码的任何错误逻辑,请告诉我。
  • @KamalReddy:是时候让你接受一些答案了。

标签: python django logic django-queryset


【解决方案1】:

您的代码不会影响原始查询集,因为查询集是惰性的。

这意味着在您的循环for event in eventset.order_by('-likes'): 中,您正在做两件事:

(1) 创建一个按“-likes”排序的新查询集;和

(2) 依次创建查询集指定的每个对象。

因此,如果您再次运行循环,您将收到新的对象,这不会反映对前一个循环中的对象所做的任何未保存的更改。

【讨论】:

    猜你喜欢
    • 2018-05-21
    • 2012-10-14
    • 2019-09-19
    • 2017-01-25
    • 2015-03-20
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多