Как вернуть все данные объекта с помощью Django objects.filter?

Я ищу пользователя в моих представлениях:

user = User.objects.filter(id=id).first()
print(user)

Это возвращает только имя пользователя. Я знаю, что могу получить доступ к другим данным, таким как nickname с user.nickname, но мне нужно сделать json объект из данных пользователя и я хотел бы знать, есть ли какой-то способ получить доступ ко всему объекту пользователя сразу, а не по одному?

Для получения словаря объекта можно использовать user.__dict__. Если вы хотите получить данные нескольких объектов в формате словаря, используйте Values Queryset:

data = User.objects.values('nickname')
print(json.dumps(list(data)))

Существует множество способов преобразования экземпляра в словарь.


1. instance.__dict__

instance.__dict__

который возвращает

{'_state': <django.db.models.base.ModelState object at 0x7fa91aacd850>, 'id': 1, 'password': 'pbkdf2_sha256$260000$EXJTbB1QbxdxNMyPeKiixS$ghD+e5KTTvUwGdoXWr02ocjq+1t7/a277pBxxDncgWE=', 'last_login': datetime.datetime(2021, 9, 10, 7, 5, 25, 542308, tzinfo=<UTC>), 'is_superuser': True, 'username': 'admin123', 'first_name': '', 'last_name': '', 'email': '', 'is_staff': True, 'is_active': True, 'date_joined': datetime.datetime(2021, 8, 25, 14, 23, 38, 892836, tzinfo=<UTC>)}

Это самый простой вариант, но в нем отсутствуют many_to_many, foreign_key.


2. model_to_dict

from django.forms.models import model_to_dict
model_to_dict(instance)

который возвращает

{'_state': <django.db.models.base.ModelState object at 0x7fa91aacd850>, 'id': 1, 'password': 'pbkdf2_sha256$260000$EXJTbB1QbxdxNMyPeKiixS$ghD+e5KTTvUwGdoXWr02ocjq+1t7/a277pBxxDncgWE=', 'last_login': datetime.datetime(2021, 9, 10, 7, 5, 25, 542308, tzinfo=<UTC>), 'is_superuser': True, 'username': 'admin123', 'first_name': '', 'last_name': '', 'email': '', 'is_staff': True, 'is_active': True, 'date_joined': datetime.datetime(2021, 8, 25, 14, 23, 38, 892836, tzinfo=<UTC>)}

3. model_to_dict(instance, fields=instance_fields)

from django.forms.models import model_to_dict
model_to_dict(instance, fields=[field.name for field in instance._meta.fields])

который возвращает

{'id': 1, 'password': 'pbkdf2_sha256$260000$EXJTbB1QbxdxNMyPeKiixS$ghD+e5KTTvUwGdoXWr02ocjq+1t7/a277pBxxDncgWE=', 'last_login': datetime.datetime(2021, 9, 10, 7, 5, 25, 542308, tzinfo=<UTC>), 'is_superuser': True, 'username': 'admin123', 'first_name': '', 'last_name': '', 'email': '', 'is_staff': True, 'is_active': True, 'date_joined': datetime.datetime(2021, 8, 25, 14, 23, 38, 892836, tzinfo=<UTC>)}

Это строго хуже, чем стандартный вызов model_to_dict.


4. Использовать сериализаторы

Django Rest Framework's ModelSerialzer позволяет вам автоматически построить сериализатор из модели.

from rest_framework import serializers


class SomeModelSerializer(serializers.ModelSerializer):
     class Meta:
         model = SomeModel
         fields = "__all__"

SomeModelSerializer(instance).data

который возвращает

{'field1': 'value1', 'field1': 'value2'}
Вернуться на верх