簡體   English   中英

用日期時間注釋Django queryset

[英]Annotate Django queryset with a datetime

因此,我有一個查詢集,需要用一些其他字段進行注釋,包括整數,布爾值和日期時間。 像這樣:

def get_appointments_with_overrides(override_price, override_start_time, override_advance_booking_needed):
    return (Appointments.objects.annotate(override_price=Value(override_price, IntegerField())).
             annotate(override_start_time=Value(override_start_time, DateTimeField())).
              annotate(override_advance_booking_needed=Value(override_advance_booking_needed, BooleanField())))

其中override_price等是Appointments模型中的所有屬性(但不是Django字段)。

當我嘗試使用此方法時(特別是當我在帶注釋的查詢集上調用first()last()時),出現以下錯誤。

AttributeError: 'DateTimeField' object has no attribute 'model'

如果刪除datetime批注,則不會出現任何錯誤,而其他兩個批注將按預期的方式正常工作。 那么,如果使用此日期時間注釋,我會做錯什么呢?

編輯添加約會模型:

class Appointments(model):

   price = models.IntegerField(null=False)
   start_time = models.DateTimeField(null=False)
   advance_booking_needed = models.BooleanField(null=False, default=True)

   def __init__(self):
      super(Appointments, self).__init__(*args, **kwargs)
      self.__override_price = None
      self.__override_start_time = None
      self.__override_advance_booking_needed = None

   @property
   def override_price(self):
      return self.__override_price

   @override_price.setter
   def override_price(self, value):
      self.__override_price = value

   @property
   def override_start_time(self):
      return self.__override_start_time

   @override_start_time.setter
   def override_start_time(self, value):
      self.__override_start_time = value

   @property
   def override_advance_booking_needed(self):
      return self.__override_advance_booking_needed

   @override_advance_booking_needed.setter
   def override_advance_booking_needed(self, value):
      self.__override_advance_booking_needed = value

再次編輯以添加堆棧跟蹤:

  File "/project_dir/appointments/tests/test_overrides.py", line 232, in test_override_values:
    overriden_appointments.last()
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/query.py", line 573, in last
    objects = list((self.reverse() if self.ordered else self.order_by('-pk'))[:1])
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/query.py", line 250, in __iter__
    self._fetch_all()
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/query.py", line 1118, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 876, in execute_sql
    sql, params = self.as_sql()
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 428, in as_sql
    extra_select, order_by, group_by = self.pre_sql_setup()
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 46, in pre_sql_setup
    self.setup_query()
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 37, in setup_query
    self.select, self.klass_info, self.annotation_col_map = self.get_select()
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 227, in get_select
    sql, params = self.compile(col, select_format=True)
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 373, in compile
    sql, params = node.as_sql(self, self.connection)
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/expressions.py", line 616, in as_sql
    val = self.output_field.get_db_prep_value(val, connection=connection)
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 1459, in get_db_prep_value
    value = self.get_prep_value(value)
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 1438, in get_prep_value
    value = super(DateTimeField, self).get_prep_value(value)
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 1296, in get_prep_value
    return self.to_python(value)
  File "/project_dir/env/fake_name/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 1392, in to_python
    (self.model.__name__, self.name, value),
AttributeError: 'DateTimeField' object has no attribute 'model'

平面且簡單,您不能將屬性用於ORM查找,不支持該屬性。

不過,您可以調查“ 自定義查找”並為您的用例實現自己的查找。

另一方面:

在模型定義中,您要聲明__override_price等作為類屬性,您可能需要確保您知道不同之處: 類vs實例屬性

好吧,至少我有一個解決方法:我可以將datetime轉換為字符串,然后存儲它

def get_appointments_with_overrides(override_price, override_start_time, override_advance_booking_needed):
    return (Appointments.objects.annotate(override_price=Value(override_price, IntegerField())).
             annotate(override_start_time=Value(override_start_time.strftime('%d-%m-%Y %H:%M:%S.%f'), CharField())).
              annotate(override_advance_booking_needed=Value(override_advance_booking_needed, BooleanField())))

然后我可以將其轉換回日期時間。

這行得通,但這很愚蠢,我真的很想知道為什么我不能直接用datetime注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM