Как вы сериализуете экземпляр модели в Django?

Если у вас есть значительно больший объем данных , этот цикл по рабочему листу будет медленным. Вероятно, лучше сразу собрать все данные и обработать их в памяти.

Option Explicit

Sub test_selection()
' My below array is based on values contained within
' selected cells
' The purpose of using two dimensional array is to
' keep values in one column of array
' while retaining cell addresses in 2nd
' dimension to print some info in relevant cells
' offset to the selected cells

    Dim i As Long, r As Long, c As String, anArray As Variant

    With Selection
        c = Split(.Cells(1).Address, "$")(1)
        r = Split(.Cells(1).Address, "$")(2) - 1
        anArray = .Columns(1).Cells.Resize(.Rows.Count, 2).Value2
    End With

    For i = LBound(anArray, 1) To UBound(anArray, 1)
        anArray(i, 1) = CStr(anArray(i, 1))
        anArray(i, 2) = "$" & c & "$" & i + r
    Next i

    TestGetFileList anArray

End Sub
140
задан the Tin Man 13 April 2016 в 22:16
поделиться

5 ответов

Вы можете легко использовать список для переноса требуемого объекта, и это все, что нужно сериализаторам django для его правильной сериализации, например:

from django.core import serializers

# assuming obj is a model instance
serialized_obj = serializers.serialize('json', [ obj, ])
221
ответ дан 23 November 2019 в 23:13
поделиться

Не похоже, что вы можете сериализовать Например, вам нужно сериализовать QuerySet для одного объекта.

from django.core import serializers
from models import *

def getUser(request):
    return HttpResponse(json(Users.objects.filter(id=88)))

У меня закончился выпуск svn django, так что это может быть не так в более ранних версиях.

1
ответ дан 23 November 2019 в 23:13
поделиться

Похоже, что вы спрашиваете, включает в себя сериализацию структуры данных экземпляра модели Django для совместимости. Другие постеры верны: если вы хотите, чтобы сериализованная форма использовалась с приложением python, которое может запрашивать базу данных через API Django, то вы бы хотели сериализовать набор запросов с одним объектом. Если, с другой стороны, вам нужен способ заново наполнить экземпляр модели где-то еще, не касаясь базы данных или не используя Django, то у вас есть небольшая работа, которую нужно сделать.

Вот что я делаю:

Во-первых, я использую demjson для конвертации. Это было то, что я нашел первым, но это может быть не лучшим. Моя реализация зависит от одной из ее функций, но должны быть аналогичные способы с другими конвертерами.

Во-вторых, Реализуйте метод json_equivalent на всех моделях, которые вам могут потребоваться сериализовать. Это магический метод для demjson , но, вероятно, вы захотите подумать о том, какую реализацию вы выберете. Идея состоит в том, что вы возвращаете объект, который напрямую конвертируется в json (т. Е. Массив или словарь). Если вы действительно хотите сделать это автоматически:

def json_equivalent(self):
    dictionary = {}
    for field in self._meta.get_all_field_names()
        dictionary[field] = self.__getattribute__(field)
    return dictionary

Это не поможет вам, если у вас нет абсолютно плоской структуры данных (нет ForeignKeys , только цифры и строки в базе данных и т. Д.). В противном случае вам следует серьезно подумать о правильном способе реализации этого метода.

В-третьих, позвоните demjson.JSON.encode (instance) , и вы получите то, что хотите.

Это магический метод для demjson , но, вероятно, вы захотите подумать о том, какую реализацию вы выберете. Идея состоит в том, что вы возвращаете объект, который напрямую конвертируется в json (т. Е. Массив или словарь). Если вы действительно хотите сделать это автоматически:

def json_equivalent(self):
    dictionary = {}
    for field in self._meta.get_all_field_names()
        dictionary[field] = self.__getattribute__(field)
    return dictionary

Это не поможет вам, если у вас нет абсолютно плоской структуры данных (нет ForeignKeys , только цифры и строки в базе данных и т. Д.). В противном случае вам следует серьезно подумать о правильном способе реализации этого метода.

В-третьих, позвоните demjson.JSON.encode (instance) , и вы получите то, что хотите.

Это магический метод для demjson , но, вероятно, вы захотите подумать о том, какую реализацию вы выберете. Идея состоит в том, что вы возвращаете объект, который напрямую конвертируется в json (т. Е. Массив или словарь). Если вы действительно хотите сделать это автоматически:

def json_equivalent(self):
    dictionary = {}
    for field in self._meta.get_all_field_names()
        dictionary[field] = self.__getattribute__(field)
    return dictionary

Это не поможет вам, если у вас нет абсолютно плоской структуры данных (нет ForeignKeys , только цифры и строки в базе данных и т. Д.). В противном случае вам следует серьезно подумать о правильном способе реализации этого метода.

В-третьих, позвоните demjson.JSON.encode (instance) , и вы получите то, что хотите.

Идея состоит в том, что вы возвращаете объект, который напрямую конвертируется в json (т. Е. Массив или словарь). Если вы действительно хотите сделать это автоматически:

def json_equivalent(self):
    dictionary = {}
    for field in self._meta.get_all_field_names()
        dictionary[field] = self.__getattribute__(field)
    return dictionary

Это не поможет вам, если у вас нет абсолютно плоской структуры данных (нет ForeignKeys , только цифры и строки в базе данных и т. Д.). В противном случае вам следует серьезно подумать о правильном способе реализации этого метода.

В-третьих, позвоните demjson.JSON.encode (instance) , и вы получите то, что хотите.

Идея состоит в том, что вы возвращаете объект, который напрямую конвертируется в json (т. Е. Массив или словарь). Если вы действительно хотите сделать это автоматически:

def json_equivalent(self):
    dictionary = {}
    for field in self._meta.get_all_field_names()
        dictionary[field] = self.__getattribute__(field)
    return dictionary

Это не поможет вам, если у вас нет абсолютно плоской структуры данных (нет ForeignKeys , только цифры и строки в базе данных и т. Д.). В противном случае вам следует серьезно подумать о правильном способе реализации этого метода.

В-третьих, позвоните demjson.JSON.encode (instance) , и вы получите то, что хотите.

10
ответ дан 23 November 2019 в 23:13
поделиться
ville = UneVille.objects.get(nom='lihlihlihlih')
....
blablablab
.......

return HttpResponse(simplejson.dumps(ville.__dict__))

Я возвращаю dict своего экземпляра

, поэтому он возвращает что-то вроде {'field1': value, "field2": value, ....}

1
ответ дан 23 November 2019 в 23:13
поделиться

Я решил эту проблему, добавив метод сериализации в свою модель:

def toJSON(self):
    import simplejson
    return simplejson.dumps(dict([(attr, getattr(self, attr)) for attr in [f.name for f in self._meta.fields]]))

Вот подробный эквивалент для тех, кто не любит однострочники:

def toJSON(self):
    fields = []
    for field in self._meta.fields:
        fields.append(field.name)

    d = {}
    for attr in fields:
        d[attr] = getattr(self, attr)

    import simplejson
    return simplejson.dumps(d)

_meta.fields - это упорядоченный список полей модели, к которым можно получить доступ из экземпляров и из самой модели.

5
ответ дан 23 November 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: