#django
#django
Вопрос:
У меня есть экземпляр модели Django (1.6) (давайте возьмем User
для примера). Я хотел бы получить значения полей для этой модели, как я могу сделать для a QuerySet
, путем вызова QuerySet().values('first_name', 'username')
. Возможно ли это, или я должен просто создать словарь с требуемыми полями?
Редактировать: немного больше информации о том, зачем мне это нужно (возможно, есть другие обходные пути). Я хочу вернуть модель Django в виде ответа JSON (используя json.dumps
, а не сериализатор JSON от Django), и пока я могу это сделать, расширив кодировщик Python JSON по умолчанию и обработав модели Django специально, преобразовав их в словари с использованием model_to_dict
. Проблема в том, что это не дает мне связанных объектов, которые мне нужны.
Вот мой код для справки:
class JsonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, models.Model):
return model_to_dict(obj) # here I'd like to pull some related values
return json.JSONEncoder.default(self, obj)
Ответ №1:
Если вы хотите извлечь все связанные значения по умолчанию, вы можете сделать следующее:
def default(self, obj):
if isinstance(obj, models.Model):
d = model_to_dict(obj) # here I'd like to pull some related values
for field in obj._meta.fields:
if field.rel: # single related object
d[field.name] = model_to_dict(getattr(obj, field.name))
return json.JSONEncoder.default(self, obj)
Это будет на один уровень глубже для отдельных связанных объектов, но не для отношений «многие ко многим» или обратных внешних ключей. Оба варианта возможны, но вам нужно будет выяснить, какие методы / атрибуты obj._meta
возвращают определенные поля.
Если вы хотите получить только определенные поля, вам придется вручную указать и извлечь эти поля.
Комментарии:
1. Я понимаю. Я надеялся на что-то, где я смогу передать нужные мне связанные поля. Я, вероятно, в конечном итоге создам свой собственный
model_to_dict
, потому что глубины 1 уровня недостаточно. Спасибо.