【问题标题】:how to store a field in the database after querying查询后如何将字段存储在数据库中
【发布时间】:2013-02-28 11:48:34
【问题描述】:

views.py:

     q3=KEBReading.objects.filter(datetime_reading__month=a).filter(datetime_reading__year=selected_year).values("signed")
     for item in q3:
       item["signed"]="signed" 
       print item["signed"]
      q3.save()  

如何将字段保存到数据库中?我正在尝试用一个值保存名为“已签名”的字段。如果我这样做 q3.save() 它会给出一个错误,因为它是一个查询集。我正在从数据库中进行查询,然后根据结果,想为字段设置一个值并保存它。

  prevdate=KEBReading.objects.filter(datetime_reading__lt=date)

我从数据库中获取的所有行都少于当前日期。但我只想要最新的记录。如果我进入 2012 年 6 月 3 日。我查询我想要的日期小于这个日期,即之前的日期。 sumbody 可以帮忙吗?

【问题讨论】:

  • 把你的问题说清楚,让我们理解。过滤查询将获取已经保存的记录,需要再次保存它们吗?
  • 这不是正确的保存代码。您的组合过滤查询和保存
  • 即时查询数据库中特定月份和年份的所有行。对于每一行,我想为属性“签名”存储一个名为“是”的值。我想将其存储在数据库(数据库)中
  • 你好@prithu,你必须使用item.signed,而不是使用item['signed'](你可能会在Javascript中这样做)。将该字段用作模型实例的属性。然后,由于您正在循环 q3 对象,因此要保存的不是单个模型实例,而是一个查询集(如列表)。它没有保存方法。您要做的是在每次迭代中保存每个项目。祝你好运。
  • @pirthu 好的,我发布答案。试试看,如果你有错误告诉我

标签: django django-queryset


【解决方案1】:
q3 = KEBReading.objects.filter(datetime_reading__month=a,
    datetime_reading__year=selected_year)       
for item in q3:
   item.signed = True
   item.save()

【讨论】:

    【解决方案2】:
    q3=KEBReading.objects.filter(...)
    

    会返回一个对象列表。 Django Model 的任何实例都是一个对象,并且该实例的所有fields 都是该对象的属性。这意味着,您必须使用 dot (.) 表示法来使用它们。

    喜欢:

    item.signed = "signed"
    

    如果您的对象是dictionary 或从字典派生的类,那么您可以使用如下命名索引:

    item["signed"] = "signed"
    

    在您的情况下,该用法无效(因为您的对象类型不是基于 dictionary

    您可以拨打update query:

    KEBReading.objects.filter(...).update(selected="selected")
    

    或者在循环中设置新值然后保存

    for item in q3:
       item.signed="signed" 
       q3.save()
    

    但在您的情况下,更新查询是一种更好的方法,因为它执行的数据库调用较少。

    【讨论】:

      【解决方案3】:

      尝试使用update query

      如果signedbooleanfield

      q3 = KEBReading.objects.filter(datetime_reading__month = a).filter(datetime_reading__year = selected_year).update(signed = True)
      

      如果是charfield:

      q3 = KEBReading.objects.filter(datetime_reading__month = a).filter(datetime_reading__year = selected_year).update(signed = "True")
      

      cmets 更新:

      如果您想获取基于 datetime_reading 月份的记录,您可以通过提供月份作为数字来实现。例如,2 代表 2 月:

      q3 = KEBReading.objects.filter(datetime_reading__month = 2).order_by('datetime_reading')
      

      如果你用signed = True 获取记录,你可以这样做:

      q3 = KEBReading.objects.filter(signed = True)
      

      如果你想通过给出一个日期来获取前一个日期的记录,你可以使用:

      prevdate = KEBReading.objects.filter(datetime_reading = (date - datetime.timedelta(days = 1)))
      

      【讨论】:

      • 非常感谢它对我有用。你也可以告诉我如何只显示特定月份数据库中的行。像只在一月或二月... q2=KEBReading.objects.all().order_by('datetime_reading')
      • @prithu 我已经更新了我的答案。核实。如果有效,请接受答案。
      • 感谢您的帮助。你能告诉我如何检查数据库中的“签名”属性是否为真
      • @prithu 检查我答案的最后一行。我已经更新了。
      • @prithu 它会按您的要求工作。如果我给01-March-2013,它将获取日期为28-Feb-2013 的记录,这是上一个日期。您正在使这个答案成为一个更长的讨论。如果您有更多疑问,请参考django docs 并自行尝试。如果您被困在某个地方,请将它们作为新问题发布,社区会为您提供帮助。不要指望社区会为您完成所有工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多