0

django-celery からエラーが発生したため、1 日の大半を完全に困惑させられました。

IM は django-haystack を使用しており、検索インデックスの一部であるモデルが更新されるたびに実行されるセロリ タスクがあります。モデルの post_save および post_delete シグナルに接続するカスタム QueuedSearchIndex クラスがあります。これは、あるモデルでは問題なく機能しますが、django.contrib.auth の User モデルである別のモデルでは機能しません。

ユーザーモデルが作成/更新されると、セロリから次のエラーが表示されます。

Problem installing fixture '/believein/data/www/platform/believein/fixtures/user.json': Traceback (most recent call last):
  File "/believein/data/python-virtualenvs/believein-platform/local/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 196, in handle    obj.save(using=using)
  File "/believein/data/python-virtualenvs/believein-platform/local/lib/python2.7/site-packages/django/core/serializers/base.py", line 165, in save    models.Model.save_base(self.object, using=using, raw=True)
  File "/believein/data/python-virtualenvs/believein-platform/local/lib/python2.7/site-packages/django/db/models/base.py", line 565, in save_base
    created=(not record_exists), raw=raw, using=using)
  File "/believein/data/python-virtualenvs/believein-platform/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 172, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/believein/data/www/platform/main/utils/search.py", line 156, in update_object
    update_search_index.delay(self, instance, self.backend)
  File "/believein/data/python-virtualenvs/believein-platform/local/lib/python2.7/site-packages/celery/app/task.py", line 343, in delay
    return self.apply_async(args, kwargs)
  File "/believein/data/python-virtualenvs/believein-platform/local/lib/python2.7/site-packages/celery/app/task.py", line 469, in apply_async
    **options)
  File "/believein/data/python-virtualenvs/believein-platform/local/lib/python2.7/site-packages/celery/app/amqp.py", line 214, in publish_task
    **kwargs)
  File "/believein/data/python-virtualenvs/believein-platform/local/lib/python2.7/site-packages/kombu/messaging.py", line 150, in publish
    compression, headers)
  File "/believein/data/python-virtualenvs/believein-platform/local/lib/python2.7/site-packages/kombu/messaging.py", line 201, in _prepare
    body) = encode(body, serializer=serializer)
  File "/believein/data/python-virtualenvs/believein-platform/local/lib/python2.7/site-packages/kombu/serialization.py", line 153, in encode
    payload = encoder(data)
  File "/believein/data/python-virtualenvs/believein-platform/lib/python2.7/copy_reg.py", line 71, in _reduce_ex
    state = base(self)
TypeError: Initialization arguments are not supported

ご覧のとおり、この例はフィクスチャをロードするときに発生しましたが、モデルを通常どおり編集するときも同じです。これは、 User の新しいインスタンスと、既存のインスタンスの更新の両方に当てはまります。私のタスクは次のようになります

@task                                                                                                                                                                                                           
def update_search_index(index, instance, backend):                                                                                                                                                              
"""task to update the solr index when a model is updated                                                                                                                                                    

:param index: instance of the ``SearchIndex``                                                                                                                                                               
:param instance: the model that was updated                                                                                                                                                                 
:type instance: ``django.db.models.Model``                                                                                                                                                                  
:param backend: the search back instance                                                                                                                                                                    
:type backend: ``haystack.backends.solr_backend``                                                                                                                                                           

see ``main.utils.search.QueuedSearchIndex`` for more info                                                                                                                                                   

"""                                                                                                                                                                                                         

backend.update(index, [instance])

searchindex クラスは次のようになります。

class QueuedSearchIndex(RealTimeSearchIndex):                                                                                                                                                                   

def update_object(self, instance, **kwargs):                                                                                                                                                                
    """Handles updating the index when a model is updated by pushing                                                                                                                                        
    the update through celery                                                                                                                                                                               

    :param instance: the instance of the model that was updated                                                                                                                                             
    :type instance: django.db.models.Model                                                                                                                                                                  

    """                                                                                                                                                                                                     
    if self.should_update(instance, **kwargs):                                                                                                                                                              
        update_search_index.delay(self, instance, self.backend)

User モデルには、UserProfile インスタンスが存在しない場合に UserProfile インスタンスを作成するための post_save シグナルを持つ UserProfile モデルとの One2One 関係があることに言及する価値があるかもしれません。

4

0 に答える 0