Вызов модели задачи из сельдерея Django ElasticSearch возвращает объект 'str', который не вызывается - PullRequest
0 голосов
/ 12 июня 2019

Сталкивается с странной проблемой, которая не возникала в других проектах с сельдереем и django.

Я беру объект JSON, повторяю его и помещаю в модель django, но не могу создать модель.

tasks.py

from __future__ import absolute_import, unicode_literals   
from myapp.celery import app
from django.apps import apps

from datetime import datetime
from zeep import Client, Settings, helpers
from zeep.wsse.username import UsernameToken
from .models import *

import pickle, json, copy

class DateTimeEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, datetime):
            return o.isoformat()

        return json.JSONEncoder.default(self, o)

@app.task()
def getProjects():
    #dumpfile is a pickled zeep obj
    dumpfile = open('dump.txt','rb')
    getDataObjs = pickle.load(dumpfile)
    getDataObjsAsOrderedDict = helpers.serialize_object(getDataObjs)
    getDataObjsAsJson = json.loads(json.dumps(getDataObjsAsOrderedDict, cls=DateTimeEncoder))
    for project in getDataObjsAsJson:
        try:
            new_project_project_key = int(copy.deepcopy(project['projectKey']))
            print(new_project_project_key)
            print(type(new_project_project_key))
            print(type(MyDjangoDBModel))
            new_project_db_obj,created = MyDjangoDBModel.objects.get_or_create(project_key=new_project_project_key)
            print("HIT")

Вот что возвращают логи

[2019-06-12 15:08:03,319: WARNING/ForkPoolWorker-4] 10836
[2019-06-12 15:08:03,319: WARNING/ForkPoolWorker-4] <class 'int'>
[2019-06-12 15:08:03,319: WARNING/ForkPoolWorker-4] <class 'django.db.models.base.ModelBase'>
[2019-06-12 15:08:03,321: WARNING/ForkPoolWorker-4] 'str' object is not callable

Я также получил ту же ошибку с MyDjangoModel = app.get_model ('имя приложения', 'имя модели'), выше с прямым импортом из .models import *. Копия, скорее всего, не нужна, хотя это была попытка обойти проблему.

UPDATE

documents.py

from elasticsearch_dsl.connections import connections
from django_elasticsearch_dsl import DocType, Index
from elasticsearch import Elasticsearch, RequestsHttpConnection
from elasticsearch_dsl import Search

client = Elasticsearch(
    ['https://user:pass@elasticsearch:9200'],
    # turn on SSL
    use_ssl=True,
    # make sure we verify SSL certificates
    verify_certs=True,
    # provide a path to CA certs on disk
    ca_certs='/usr/src/app/ca.crt',
    connection_class=RequestsHttpConnection
)

my_search = Search(using=client)

from .models import MyDjangoModel

# Create a connection to ElasticSearch
connections.create_connection()

myDjangoModel = Index('myDjangoModel')

myDjangoModel.settings(
    number_of_shards=1,
    number_of_replicas=0
)


@myDjangoModel.doc_type
class siteMyDjangoModelDocument(DocType):

    class Meta:
        model = MyDjangoModel
        fields = ['project_key', 'name', 'description', 'userCreated', 'userModified']


# define simple search here
# Simple search function
def search(title):
    query = my_search.query("match", name=title)
    response = query.execute()
    return response

models.py

from django.db import models

# Create your models here.
class MyDjangoModel(models.Model):
    """Handles x"""
    project_key = models.IntegerField(db_index=True) 
    name = models.TextField(blank=True)
    description = models.TextField(blank=True)
    userCreated = models.TextField(blank=True)
    userModified = models.TextField(blank=True) 

в соответствии с просьбой, я запустил это вне сельдерея, вот как выглядит трассировка, основной причиной выглядит библиотека django_elasticsearch_dsl, Я добавил оба файла models.py и documents.py выше.

'str' object is not callable
Traceback (most recent call last):
  File "tests.py", line 59, in <module>
    new_project_db_obj = GetProjects.objects.create(project_key=new_project_project_key)
  File "/usr/local/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/django/db/models/query.py", line 422, in create
    obj.save(force_insert=True, using=self.db)
  File "/usr/local/lib/python3.7/site-packages/django/db/models/base.py", line 741, in save
    force_update=force_update, update_fields=update_fields)
  File "/usr/local/lib/python3.7/site-packages/django/db/models/base.py", line 790, in save_base
    update_fields=update_fields, raw=raw, using=using,
  File "/usr/local/lib/python3.7/site-packages/django/dispatch/dispatcher.py", line 175, in send
    for receiver in self._live_receivers(sender)
  File "/usr/local/lib/python3.7/site-packages/django/dispatch/dispatcher.py", line 175, in <listcomp>
    for receiver in self._live_receivers(sender)
  File "/usr/local/lib/python3.7/site-packages/django_elasticsearch_dsl/signals.py", line 57, in handle_save
    registry.update(instance)
  File "/usr/local/lib/python3.7/site-packages/django_elasticsearch_dsl/registries.py", line 75, in update
    doc().update(instance, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/django_elasticsearch_dsl/documents.py", line 231, in update
    self._get_actions(object_list, action), **kwargs
  File "/usr/local/lib/python3.7/site-packages/django_elasticsearch_dsl/documents.py", line 191, in bulk
    return bulk(client=self.connection, actions=actions, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/elasticsearch_dsl/document.py", line 269, in _get_connection
    return connections.get_connection(using or self._doc_type.using)
  File "/usr/local/lib/python3.7/site-packages/elasticsearch_dsl/connections.py", line 91, in get_connection
    return self.create_connection(alias, **self._kwargs[alias])
  File "/usr/local/lib/python3.7/site-packages/elasticsearch_dsl/connections.py", line 66, in create_connection
    conn = self._conns[alias] = Elasticsearch(**kwargs)
  File "/usr/local/lib/python3.7/site-packages/elasticsearch/client/__init__.py", line 192, in __init__
    self.transport = transport_class(_normalize_hosts(hosts), **kwargs)
  File "/usr/local/lib/python3.7/site-packages/elasticsearch/transport.py", line 127, in __init__
    self.set_connections(hosts)
  File "/usr/local/lib/python3.7/site-packages/elasticsearch/transport.py", line 177, in set_connections
    connections = list(zip(connections, hosts))
  File "/usr/local/lib/python3.7/site-packages/elasticsearch/transport.py", line 173, in _create_connection
   return self.connection_class(**kwargs)
TypeError: 'str' object is not callable

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Пожалуйста, убедитесь, что версия всех пакетов выглядит следующим образом, особенно:

  1. Django
  2. elasticsearch,
  3. elasticsearch-dsl
  4. django-elasticsearch-dsl

Убедитесь, что они совместимы между собой и поддерживаются, также имейте в виду, что вы запускаете все через Python 3.7

0 голосов
/ 12 июня 2019

Ваше поле project_key на MyDjangoDBModel CharField?
Если project['projectKey'] также является строкой, попробуйте поставить напрямую.

MyDjangoDBModel.objects.get_or_create(project_key=project['projectKey'])

Давайте посмотрим, будет ли какая-либо разница.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...