#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. спасибо, что выглядит действительно так, как мне нужно, попробую