Como selecciono que campos quiero de un queryset?

1,073 views
Skip to first unread message

Marcelo Kazalukian

unread,
Jan 21, 2016, 12:50:48 PM1/21/16
to Django-es
Tengo los modelos: 

class Stock(models.Model):
    descripcion = models.CharField(max_length=100)

    def __str__(self):
     return self.descripcion

class Productos(models.Model):
    idstock = models.ForeignKey(Stock) 
    descripcion = models.CharField(max_length=150)   

    def __str__(self):
     return self.descripcion

Y tengo la vista

def ProductosXStock(request,pk):
       data = serializers.serialize("json", Productos.objects.filter(idstock=pk))
     return HttpResponse(data)

La vista me devuelve 

[{"model": "gestion.productos", "pk": 1, "fields": {"idstock": 1, "descripcion": "Manual Santillana"}}, {"model": "gestion.productos", "pk": 2, "fields": {"idstock": 1, "descripcion": "Manual 3er grado"}}]

Como hago para que me devuelva solo algunos de los campos y no todos. Por ejemplo: pk y idStock. O sea, dos registros pero solo esos campos.

Busqué y probé varias soluciones de Internet pero no funcionaron.

Muchas gracias.

js.to...@me.com

unread,
Jan 21, 2016, 12:58:04 PM1/21/16
to djan...@googlegroups.com

Como puedes ver, el segundo parámetro de tu serializer es una QuerySet... te sugiero que consultes la documentación de las consultas para que veas que opción te conviene mas.

https://docs.djangoproject.com/en/1.9/ref/models/querysets/#values

Enviado desde Outlook Mobile




--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Marcos Lewis

unread,
Jan 21, 2016, 1:02:05 PM1/21/16
to djan...@googlegroups.com

Marcelo Kazalukian

unread,
Jan 22, 2016, 9:11:22 AM1/22/16
to Django-es
Muchas gracias Perro Muerto y Marquinho. Lo resolví de la siguiente manera:


def ProductosXStock(request,pk):
data = serializers.serialize("json", Productos.objects.filter(idstock=pk), fields=('pk','idstock'))
return HttpResponse(data)


Había probado con "values_list()" y con "values()" pero siempre me fallaba hasta que descubrí "fields".

Igualmente en la respuesta me incluye el modelo! hay forma de evitar esto?

[{"model": "gestion.productos", "pk": 1, "fields": {"idstock": 1}}, {"model": "gestion.productos", "pk": 2, "fields": {"idstock": 1}}]

Muchas gracias.

Marcos Lewis

unread,
Jan 22, 2016, 10:05:42 AM1/22/16
to djan...@googlegroups.com
Para un caso así yo he creado un serializador propio:

from django.utils.encoding import force_text
from django.core.serializers.json import Serializer

class MySerializer(Serializer):

    internal_use_only = False

    def get_dump_object(self, obj):
        data = super(MySerializer, self).get_dump_object(obj)
        newdata = {}
        newdata.update(data['fields'])
        newdata['pk'] = data['pk']
        return newdata

para el caso se usaría de esta manera:

data = MySerializer().serialize(Productos.objects.all(), fields=('idstock'))

Daniel Chimeno

unread,
Jan 22, 2016, 11:35:57 AM1/22/16
to Django-es
Hola,

En su caso, antes de coger todos los fields y serializar solo unos pocos, mejor coger solo los fields necesarios de la BD
como bien has indicado.

carlos

unread,
Feb 29, 2016, 11:29:06 PM2/29/16
to djan...@googlegroups.com
bueno a lo mejor te falto algo por hacer pero values_list() funciona bien.
tuquery.values_list('id','otrocampo','mas_campo') y si solo vas a ocupar uno values_list('id', flat=True)

saludos

Reply all
Reply to author
Forward
0 new messages