Как вернуть все данные объекта с помощью 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'}