Как настроить сторону Python моих моделей Django? - PullRequest
0 голосов
/ 08 августа 2011

У меня есть приложение Django, которое определяет отношение модели «один ко многим».Модели выглядят так:

from django.db import models

# Create your models here.
class StreamNetwork(models.Model):
    name = models.CharField(max_length=50)

    def __unicode__(self):
        return self.name

class Stream(models.Model):
    name = models.CharField(max_length=50)
    custom_url = models.CharField(max_length=100, null=True)
    network = models.ForeignKey(StreamNetwork)
    score = models.SmallIntegerField()

    def __unicode__(self):
        return self.name

Позже я хочу сериализовать все мои записи Stream в json.Я делаю это так:

from django.core.serializers import serialize
string = serialize(format, Stream.objects.all())

Ожидаемый результат будет простой сериализованной версией json строки в базе данных.Вместо этого вывод выглядит так:

[
    {
        "pk" : 1,
        "model" : "website.stream",
        "fields" : 
        {
            "network" : 2,
            "score" : 53,
            "name" : "DangerousDan1",
            "custom_url" : null
        }
    }, 
    ...

Кроме того, я хотел бы получить имя потоковой сети в выводе вместо id.

Так есть ли способ Django?Я могу настроить форматирование выходных данных сериализации?

Спасибо за любые полезные ответы

Ответы [ 3 ]

1 голос
/ 08 августа 2011

Имейте в виду, что QuerySet - это не просто запрос к базе данных, поэтому «ожидаемый результат» должен заключаться в том, что он содержит дополнительную информацию.Один простой способ сделать то, что вы хотите (и я бы сказал, что это путь Django), - это определить менеджер моделей , который возвращает только то, что вы хотите.Что-то вроде:

import simplejson

class StreamManager(models.Manager):
    def all_serialized(self):
        qset = super(StreamManager, self).get_query_set()
        return simplejson.dumps(
               [{ 'id':item.id, 
                  'name':item.name, 
                  'network':item.network.name, 
                  'score':item.score,
                  'custom_url':item.custom_url,}
                  for item in qset])

, затем поместите objects = StreamManger() в свой класс Stream, и вы можете получить доступ к потоку как Stream.objects.all_serialized ()

Другой способ сделать это -подкласс QuerySet, поэтому он возвращает только необходимую информацию, а затем использует метод serialize () в наборе запросов, но я никогда не вникал в это и предполагал, что для этого потребуются некоторые знания о том, как QuerySets работает под капотом (это может быть немного большеэффективнее, чем мое решение, но, поскольку цель состоит в том, чтобы сериализовать все, и вы хотите выполнить поиск внешнего ключа для каждой записи, чтобы найти имя сети, я предполагаю, что вы не работаете с огромным количеством данных).

РЕДАКТИРОВАТЬ: в отношении вашего комментария к решению Роба см. документацию для serialize () - вы можете определить поля, которые вы хотите сериализовать, но я не думаю, что он поддерживает поиск по внешнему ключу, и вывсе еще получите его в формате QuerySet (pk, модель и поля).

0 голосов
/ 08 августа 2011

Другой, чистый Django механизм заключается в использовании model_to_dict:

from django.forms.models import model_to_dict
results = []
for instance in query:
    d = model_to_dict(instance, fields=['field1', 'field2', ...])
    results.append(d)
string = serialize(format, results)
0 голосов
/ 08 августа 2011

Я использую django-pneon для моих успокоительных API и сериализации, используя его инфраструктуру, вы можете настраивать, какие поля, ссылочные объекты включать, и добавлять дополнительные или переименовывать поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...