[Python] Help me with PG JSON e Django

Alessandro Dentella sandro a e-den.it
Mar 27 Dic 2016 22:56:32 CET


On Tue, Dec 27, 2016 at 10:03:59PM +0100, Carlos Catucci wrote:
> Secondo il manuale di Django, versione 1.9, si possono definire,
> previa importazione dellì'apposito contrib (from
> django.contrib.postgres.fields import JSONField) dei campi json in una
> tabella.
> Ed in effetti la creazione (Blocks.objects.create(....)) funziona benissimo.
> I dolori vengono al momento di recuperare di dati immagazzinati in
> questa struttura JSON.
> A sentire il manuale sarebeb tutto semplice e pulito
>
> Dog.objects.filter(data__breed='collie')
>
> oppure per casi complessi
>
> Dog.objects.filter(data__contains={'owner': 'Bob'})
>
> Peccato che pur provando e riprovando i dati non vengno recuperati mai.
>
> La struttura del model e' la seguente:
>
> class Blocks(models.Model):
>     agency = models.ForeignKey("users.Agencies")
>     agency_code = models.CharField(max_length=30)
>     rent_sale = models.CharField(max_length=1,choices=RENT_SALE)
>     search_offer = models.CharField(max_length=1,choices=SEARCH_OFFER)
>     block_type = models.CharField(max_length=100)
>     location = models.CharField(max_length=200)
>     customer_price = models.FloatField(default=0.0)
>     agency_price = models.FloatField(default=0.0)
>     details = JSONField()
>     active = models.BooleanField(default=True)
>     deleted = models.BooleanField(default=False)
>
> Questo un esempio di inserimento
>
> Blocks.objects.create(agency_id=1,agency_code='C0001',rent_sale='1',search_offer='2',block_type='appartamento',location='pescara',customer_price=100000.0,agency_price=80000.0,
> active='t',deleted='f',details= {'block_details': [{"details": {"mp":
> "M", "mq": "80:", "qta": "2:"}, "attribute": "camera da letto"},
> {"details": {"mp": "M", "mq": "80:", "qta": "2:"}, "attribute":
> "camera da letto"}, {"details": {"mp": "M", "qta": "1:"}, "attribute":
> "bagno"}, {"details": {"mp": "P", "yn": "Y:"}, "attribute": "posto
> auto"}, {"details": {"mp": "M", "yn": "Y:"}, "attribute":
> "ascensore"}]})
>
> Ma se eseguo una query tipo
>
> Blocks.objects.filter(details__contains={'attribute': 'bagno'})
>
> ottengo indietro una lista vuota ( [] )

io confermo che questa sintassi per me funziona. Ho un caso analogo
dove i dati sono:

   {"display_name": "Salvatore Z...", "activate_url":
   "https://trepalchi.it/accounts/.../",
   "current_site": "trepalchi.it",
   "subject": "Salvatore Z... conferma la tua email per entrare nel
   portale Trepalchi.it", }

In [1]: models.Transmission.objects.filter(substitution_data__contains={'display_name': 'Salvatore Z...'})
Out[1]: <QuerySet [<Transmission: Signup confirmation of Salvatore Z...>]>

Posso suggerirti di controllare:

* cosa hai veramente nel db
* se da prompt di pg tutto funziona (a me la parte saliente del WHERE
     è:

     WHERE "marketing_transmission"."substitution_data" @>
     '{"display_name": "Salvatore Z..."}'

Ricordo che all'inizio avevo problemi nell'inserimento e mi finivano
dentro nel valore del campo delle graffe controbarrate. Era un
problema di interfaccia (admin), non di ORM a memoria.


sandro
*:-)



--
Sandro Dentella  *:-)
http://trepalchi.it                Il portale degli artisti


Maggiori informazioni sulla lista Python