Лучшее место, чтобы поместить метод / функцию saveAll - PullRequest
0 голосов
/ 08 января 2020

У меня есть класс Model, который структурирован следующим образом:

class Item(models.Model):

    place = models.CharField(max_length=40)
    item_id = models.IntegerField()
    # etc.

    @classmethod
    def from_obj(cls, **kwargs):
        i = Item()
        # populate this from json data
        # which needs a lot of translations applied
        # before saving the data

Итак, из вышеизложенного у меня есть способ создать экземпляр Item с помощью метода класса from_obj. Теперь я хочу обработать массив json, содержащий около 100 объектов, для создания этих 100 экземпляров Item. Куда это нужно положить? Функция / метод будет выглядеть примерно так:

def save_all():
    objects = requests.get(...).json()
    for obj in objects:
        item = Item.from_obj(obj)
        item.save()

Если это staticmethod в Item. Простая функция за ее пределами? Или должен быть создан другой класс для «управления» Предметом. Что обычно считается лучшей практикой для чего-то подобного этому шаблону?

Ответы [ 2 ]

1 голос
/ 08 января 2020

Если бы это было чисто Python, я бы сказал, что нужно использовать обычную функцию или сделать ее методом класса.

Теперь это ORM django, а соглашение для " операции на уровне таблицы здесь, чтобы поместить их в пользовательский ModelManager класс .

EDIT Кроме того, в вашем примере есть исходящий HTTP-запрос, который предполагает, что он может быть лучше в виде простой функции - он ближе к команде просмотра или управления, чем к методу ModelManager

Почему python поощряет один путь, а django поощряет другой путь?

Python сам по себе "не поощряет" ничего особенного, эти (простая функция) или метод класса) - это просто очевидный выбор - не имеет смысла делать это методом экземпляра (вам здесь не нужен экземпляр) или статическим методом (так как вы используете класс).

* 1024 ORM - это, ну, ORM - платформа, которая пытается обеспечить Python представление (скорее формального и специализированного) домена реляционных баз данных. В этом контексте имеет смысл отделить операции на уровне строк (методы классов моделей) от операций на уровне таблиц (классы modelmanager).

1 голос
/ 08 января 2020

Для этого идеально подходит метод bulk_create , вы можете добавить дополнительный метод класса, который вызывает API, а основная масса создает все объекты

@classmethod
def bulk_create_from_api(cls):
    objects = requests.get(...).json()
    cls.objects.bulk_create([cls.from_obj(obj) for obj in objects])

Используется так

Item.bulk_create_from_api()

Обратите внимание: bulk_create не отправляет никаких сигналов, таких как pre_save или post_save

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