Джанго: интеграция внешних классов? - PullRequest
0 голосов
/ 28 октября 2018

Я заранее прошу прощения за глупый вопрос.:)

Я пытаюсь создать REST API с помощью rest-framework Django.Этот API находится поверх алгоритма, который я пытался интегрировать в инфраструктуру Django, но это расстраивает, чтобы сделать это должным образом, и я подозреваю, что это из-за моего плохого понимания Django.

Здесьмои фрагменты кода.

models.py

from django.db import models                                                                         

class my_model(models.Model):
  dob = models.TextField()
  response = models.TextField()
  field1 = models.TextField()

class Meta:
  ordering = ('dob','response','field1')

serializers.py

import re
import numpy as np
from django_rest.quickstart.models import my_model
from rest_framework import serializers
from rest_framework.renderers import JSONRenderer
from my_algorithm import my_algorithm

class myAlgorithmSerializer(serializers.ModelSerializer):
  my_algorithm_instance = my_algorithm()
  response = serializers.SerializerMethodField('myAlgorithm_wrapper',my_algorithm_instance)
  field1 = serializers.SerializerMethodField('field1_wrapper', my_algorithm_instance)

  def myAlgorithm_wrapper(self, my_model, my_algorithm_instance):

    # Get the inputs.                                                                                                                                                                                   
    dob = str(my_model.dob)

    components = np.array(re.split('/| |:', dob)).astype(int)

    birth_day = components[0]
    birth_month = components[1]
    birth_year = components[2]
    birth_hour = components[3]
    birth_minutes = components[4]

    my_algorithm_instance.set_birthdate_time(\
                birth_year, birth_month, birth_day,\
                birth_hour, birth_minutes)

    my_algorithm_instance.run()

    my_structure = my_algorithm_instance.my_struct
    content = JSONRenderer().render(my_structure)

    return(content)

  def field1_wrapper(self, my_model, my_algorithm_instance):
    another_structure = my_algorithm_instance.another_pillar_struct
    content = JSONRenderer().render(another_structure)
    return(content)

  class Meta:
    model = Bazhi
    fields = ('dob', 'response', 'field1')

Я получаю сообщение об ошибке, которое по существу говорит о том, что методы myAlgorithm_wrapperа 'field1_wrapper' принимает только 2 аргумента, а не обязательные 3. Мой экземпляр алгоритма требуется в обеих оболочках, но даже если они должны быть в рамках этих методов, они сообщаются как «отсутствующие».Трассировка стека ниже.

Traceback (most recent call last):
  File "/home/pi/myAlgorithm/lib/python3.5/site-packages/django/utils/autoreload.py", line 225, in wrapper
    fn(*args, **kwargs)
  File "/home/pi/myAlgorithm/lib/python3.5/site-packages/django/core/management/commands/runserver.py", line 117, in inner_run
    self.check(display_num_errors=True)
  File "/home/pi/myAlgorithm/lib/python3.5/site-packages/django/core/management/base.py", line 379, in check
    include_deployment_checks=include_deployment_checks,
  File "/home/pi/myAlgorithm/lib/python3.5/site-packages/django/core/management/base.py", line 366, in _run_checks
    return checks.run_checks(**kwargs)
  File "/home/pi/myAlgorithm/lib/python3.5/site-packages/django/core/checks/registry.py", line 71, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/home/pi/myAlgorithm/lib/python3.5/site-packages/django/core/checks/urls.py", line 40, in check_url_namespaces_unique
    all_namespaces = _load_all_namespaces(resolver)
  File "/home/pi/myAlgorithm/lib/python3.5/site-packages/django/core/checks/urls.py", line 57, in _load_all_namespaces
    url_patterns = getattr(resolver, 'url_patterns', [])
  File "/home/pi/myAlgorithm/lib/python3.5/site-packages/django/utils/functional.py", line 37, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/pi/myAlgorithm/lib/python3.5/site-packages/django/urls/resolvers.py", line 533, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/pi/myAlgorithm/lib/python3.5/site-packages/django/utils/functional.py", line 37, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/pi/myAlgorithm/lib/python3.5/site-packages/django/urls/resolvers.py", line 526, in urlconf_module
    return import_module(self.urlconf_name)
  File "/home/pi/myAlgorithm/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 673, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "/home/pi/myAlgorithm_app/myAlgorithm/django_rest/urls.py", line 29, in <module>
    from django_rest.quickstart import views
  File "/home/pi/myAlgorithm_app/myAlgorithm/django_rest/quickstart/views.py", line 8, in <module>
    from django_rest.quickstart.serializers import UserSerializer, GroupSerializer, myAlgorithmSerializer
  File "/home/pi/myAlgorithm_app/myAlgorithm/django_rest/quickstart/serializers.py", line 25, in <module>
    class myAlgorithmSerializer(serializers.ModelSerializer):
  File "/home/pi/myAlgorithm_app/myAlgorithm/django_rest/quickstart/serializers.py", line 27, in myAlgorithmSerializer
    response = serializers.SerializerMethodField('myAlgorithm_wrapper', my_algorithm_instance)
TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given

Должен ли я включить это в models.py вместо использования менеджера?Документация, кажется, не включает в себя способ получить определенное поле - в моем случае, dob, и обработать его.Даже если этот метод правдоподобен, у меня возникнут проблемы с областью видимости, как в сериализаторе?Любое руководство будет оценено.

Большое спасибо!
Ed

1 Ответ

0 голосов
/ 28 октября 2018

Проблема не имеет ничего общего с вашими внешними классами.Как показывает трассировка, проблема заключается в аргументах SerializerMethodField.Как и во всех полях сериализатора, следует использовать аргументы с ключевыми словами, а не позиционные аргументы;и главное ключевое слово arg для этого поля: method_name.

Я не понимаю, чего вы пытаетесь достичь, передавая экземпляр алгоритма в поле.Даже если это сработало, в документах также указано, что методы, на которые ссылаются из этого поля, должны иметь один аргумент - сериализуемый объект.Если идея заключается в том, что экземпляр алгоритма является чем-то общим для обоих методов, то, возможно, вам следует создать его экземпляр в методе __init__ сериализатора, а затем просто ссылаться на него в методах:

class myAlgorithmSerializer(serializers.ModelSerializer):
  response = serializers.SerializerMethodField(method_name='myAlgorithm_wrapper')
  field1 = serializers.SerializerMethodField(method_name='field1_wrapper')

  def __init__(self, *args, **kwargs):
     self.my_algorithm_instance = my_algorithm()
     super().__init__(*args, **kwargs)

  def myAlgorithm_wrapper(self, my_model):
     ...
     # refer to self.my_algorithm_instance
     ...
...