Django анализирует данные для моделирования без сохранения

#python #django #django-serializer #python-dataclasses #data-class

Вопрос:

Мне было интересно, есть ли способ проанализировать json для объекта класса модели без какого-либо взаимодействия с базой данных. Если мы сделаем то, что я хочу сделать без django, я мог бы сериализовать Json в класс объектов, например, с помощью marshmallow_dataclass

 @dataclass
class Example:
    id : int
    name : str
 

Если я делаю это с помощью модели и сериализатора django, я делаю это с помощью сериализатора стандартной модели и класса модели:

 serializer = ExampleSerializer(data=data)
serializer.is_valid(raise_exception=True)
serializer.save()
 

Итак, теперь вопрос в том, есть ли способ их объединить. Причина этого в том, что у меня есть общая модель для разных приложений. Теперь, поскольку некоторые просто обрабатывают данные, нет необходимости хранить их, что я в настоящее время делаю, но это недостаток производительности. В то же время, объединяя их, я хочу добиться того, чтобы не приходилось поддерживать модель и класс с одинаковыми полями.
Поэтому как я могу использовать класс модели для анализа данных без необходимости хранить их в базе данных?

Комментарии:

1. Насколько сложны ваши модели? Есть ли у них какие-либо связанные поля)? Если все поля в вашем сериализаторе являются допустимыми свойствами вашей модели, я думаю, вы можете просто сделать obj = ExampleModel(**serializer.validated_data) это после вызова serializer.is_valid() .

2. да, я изучал это, но у них есть много связанных таблиц, также содержащих сами связанные поля, поэтому важно также иметь возможность иметь связанные объекты, что, судя по моим исследованиям, невозможно сделать с помощью предложенного вами решения

3. Правильно, и без сохранения данных в базе данных вы действительно сможете обрабатывать только внешние ключи из рассматриваемой модели (не многие ко многим или обратные отношения), так как все остальное в любом случае будет связано с наборами запросов. Если вы знаете список внешних ключей, которые хотите заполнить, вы можете извлечь эти значения из проверенных данных и заполнить их отдельно или проанализировать метаданные модели аналогично тому, как это делает DRF, чтобы определить, какие поля являются FK: github.com/encode/django-rest-framework/blob/master/…

Ответ №1:

Если я правильно понял вопрос, вы хотите провести комбинированную проверку для заранее определенных классов моделей, фактически не используя методы, предоставляемые django, для создания экземпляра модели. Один интересный метод достижения этой цели заключается в использовании pydantic-django для этой задачи. Вы можете создать класс pydantic model_class для анализа данных по мере необходимости, который обеспечит выполнение всех проверок за вас. Например, если ваш пример модели такой, как показано ниже:

 class Example(models.Model):
    f1 = models.CharField(max_length=255)
 

связанный класс pydantic для проверки может быть:

 from pydantic_django import ModelSchema
class ExampleSchema(ModelSchema):
    class Config:
        model = Example
 

Комментарии:

1. спасибо, что выглядит действительно так, как мне нужно, попробую