[英]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'
好吧,至少我有一個解決方法:我可以將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.