2011-11-19 3 views
2

Это ошибка, я получаю:PyAMF DatabaseError: «Этот запрос не поддерживается базой данных». при возврате объекта пользователя

ERROR 2011-11-19 04:19:55,441 django.py:164] Error encoding AMF request 
Traceback (most recent call last): 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/remoting/gateway/django.py", line 161, in __call__ 
    logger=self.logger, timezone_offset=timezone_offset) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/remoting/__init__.py", line 676, in encode 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/remoting/__init__.py", line 520, in _write_body 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/remoting/__init__.py", line 486, in _encode_body 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/codec.py", line 499, in writeElement 
    func(data) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/amf0.py", line 657, in writeAMF3 
    self.context.getAMF3Encoder(self).writeElement(data) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/codec.py", line 499, in writeElement 
    func(data) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/amf3.py", line 1456, in writeObject 
    self.writeElement(value) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/codec.py", line 499, in writeElement 
    func(data) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/amf3.py", line 1298, in writeList 
    [self.writeElement(x) for x in n] 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/codec.py", line 499, in writeElement 
    func(data) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/codec.py", line 358, in __call__ 
    ret = self.func(data, encoder=self.encoder) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/adapters/_django_db_models_base.py", line 276, in writeDjangoObject 
    encoder.writeObject(referenced_object) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/amf3.py", line 1468, in writeObject 
    self.writeElement(value) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/codec.py", line 499, in writeElement 
    func(data) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/codec.py", line 358, in __call__ 
    ret = self.func(data, encoder=self.encoder) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/adapters/_django_db_models_base.py", line 276, in writeDjangoObject 
    encoder.writeObject(referenced_object) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/amf3.py", line 1468, in writeObject 
    self.writeElement(value) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/codec.py", line 499, in writeElement 
    func(data) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/codec.py", line 358, in __call__ 
    ret = self.func(data, encoder=self.encoder) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/adapters/_django_db_models_base.py", line 276, in writeDjangoObject 
    encoder.writeObject(referenced_object) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/amf3.py", line 1447, in writeObject 
    attrs = alias.getEncodableAttributes(obj, codec=self) 
    File "/Library/Python/2.6/site-packages/PyAMF-0.6.1-py2.6-macosx-10.6-universal.egg/pyamf/adapters/_django_db_models_base.py", line 173, in getEncodableAttributes 
    attrs[name] = [x for x in getattr(obj, name).all()] 
    File "/Users/bryce/Documents/Aptana Studio 3 Workspace/django-blog/django/db/models/query.py", line 107, in _result_iter 
    self._fill_cache() 
    File "/Users/bryce/Documents/Aptana Studio 3 Workspace/django-blog/django/db/models/query.py", line 774, in _fill_cache 
    self._result_cache.append(self._iter.next()) 
    File "/Users/bryce/Documents/Aptana Studio 3 Workspace/django-blog/django/db/models/query.py", line 275, in iterator 
    for row in compiler.results_iter(): 
    File "/Users/bryce/Documents/Aptana Studio 3 Workspace/DennysBE/djangotoolbox/db/basecompiler.py", line 225, in results_iter 
    self.check_query() 
    File "/Users/bryce/Documents/Aptana Studio 3 Workspace/DennysBE/djangotoolbox/db/basecompiler.py", line 273, in check_query 
    raise DatabaseError('This query is not supported by the database.') 
DatabaseError: This query is not supported by the database. 

Вот мои модели, которые имеют значение для решения этой проблемы:

class ChallengeAct(models.Model): 
    challenge = models.ForeignKey(Challenge, blank=True, null=True) 
    user = models.ForeignKey(User, blank=True, null=True) 
    start_date = models.DateTimeField(blank=True, null=True) 
    progress_value = models.IntegerField(default=0) 
    earned_coupon = models.ForeignKey(EarnedCoupon, blank=True, null=True) 

Вот метод, который вызывает ошибку:

def foo_bar(request): 
    user = request.user 
    c = ChallengeAct() 
    c.challenge = Challenge.objects.get(id=1) 
    c.start_date = datetime.now() 
    c.progress_value = 1 
    c.user = user 
    c.save() 

# Here is where I set the user to null to avoid the DatabaseError 
    c.user = None 
    return [c] 

интересно то, что мне нужно, чтобы установить c.user = None прямо перед тем, как вернуть его, так что я не получаю DatabaseError: This query is not supported by the database. проблема.

--update-- Чем больше я думаю об этом, тем больше я думаю о проблеме pyamf и django-nonrel с получением объекта пользователя. Я предполагаю, что когда pyamf пытается получить пользовательский объект, он использует некоторый тип запроса соединения, который не поддерживается на django-нереле.

Почему это? Есть ли способ обойти это?

+0

Как выглядит класс «RewardActBase»? – Oleksiy

+0

Я достал расширение базовой базы награды за ясность. –

ответ

0

Для модели пользователя вам не нужно указывать blank=True, null=True. Обычно django.contrib.auth.models.AnonymousUser выполняет анонимные запросы. Это может или не может устранить проблему, но стоит попробовать, то есть:

class ChallengeAct(RewardActBase): 
    user = models.ForeignKey(User) 
    .... 
+0

Я пробовал это, но ничего не делал. Спасибо, что дал ему шанс, хотя ... –