Nota: gli sviluppatori che creano nuove applicazioni sono vivamente incoraggiati a utilizzare la libreria client NDB, che offre diversi vantaggi rispetto a questa libreria client, ad esempio la memorizzazione nella cache automatica delle entità tramite l'API Memcache. Se al momento utilizzi la libreria client DB precedente, leggi la guida alla migrazione da DB a NDB
Il datastore di App Engine supporta un insieme fisso di tipi di valori per le proprietà delle entità di dati.
Le classi
Property
possono definire nuovi tipi che vengono convertiti ai tipi di valore sottostanti e da questi, mentre i tipi di valore possono essere utilizzati direttamente con le proprietà dinamiche
Expando
e i modelli di proprietà aggregate
ListProperty.
La tabella seguente descrive le classi di proprietà i cui valori corrispondono direttamente ai tipi di dati sottostanti. Qualsiasi di questi tipi di valore può essere utilizzato in una proprietà dinamica Expando o in un tipo aggregato ListProperty.
| Classe di proprietà | Tipo di valore | Ordinamento |
|---|---|---|
IntegerProperty
|
int
long
(64 bit)
|
Numerico |
FloatProperty
|
float
|
Numerico |
BooleanProperty
|
bool
|
False < True |
StringProperty
|
str
unicode
|
Unicode (str viene trattato come ASCII) |
TextProperty
|
db.Text
|
Nessuno |
ByteStringProperty
|
ByteString
|
Ordine dei byte |
BlobProperty
|
db.Blob
|
Nessuno |
DateProperty
TimeProperty
DateTimeProperty
|
datetime.date
datetime.time
datetime.datetime
|
Cronologica |
GeoPtProperty
|
db.GeoPt
|
Per latitudine, poi per longitudine |
PostalAddressProperty
|
db.PostalAddress
|
Unicode |
PhoneNumberProperty
|
db.PhoneNumber
|
Unicode |
EmailProperty
|
db.Email
|
Unicode |
UserProperty
|
users.User
|
Indirizzo email in ordine Unicode. Tieni presente che devi evitare di utilizzare UserProperty, come indicato nella nota in Descrizione della classe UserProperty. |
IMProperty
|
db.IM
|
Unicode |
LinkProperty
|
db.Link
|
Unicode |
CategoryProperty
|
db.Category
|
Unicode |
RatingProperty
|
db.Rating
|
Numerico |
ReferenceProperty
SelfReferenceProperty
|
db.Key
|
Per elementi del percorso
(kind, identifier, kind, identifier...) |
blobstore.BlobReferenceProperty
|
blobstore.BlobInfo
|
Ordine dei byte |
ListProperty
StringListProperty
|
list
di un tipo supportato |
Se in ordine crescente, per elemento minimo;
se in ordine decrescente, per elemento massimo |
Tipi di valori di Datastore
I valori delle proprietà delle entità del data store possono essere di uno dei seguenti tipi. Consulta la sezione precedente per un elenco delle classi Property corrispondente da utilizzare con le definizioni Model.
A parte i tipi standard di Python e users.User, tutti i tipi descritti in questa sezione sono forniti dal modulo google.appengine.ext.db.
strounicode-
Una stringa breve (massimo 1500 byte).
Si presume che un valore
strsia un testo codificato con il codecasciie venga convertito in un valoreunicodeprima di essere memorizzato. Il valore viene restituito dal datastore come valoreunicode. Per stringhe brevi che utilizzano altri codec, utilizza un valoreunicode.Le stringhe brevi vengono indicizzate dal data store e possono essere utilizzate nei filtri e negli ordini di ordinamento. Per le stringhe di testo più lunghe di 1500 byte (che non vengono indicizzate), utilizza un'istanza
Text. Per stringhe di byte non codificate più lunghe di 1500 byte (anche non indicizzate), utilizza un'istanzaBlob. Per le stringhe di byte non codificate non di testo fino a 1500 byte (non caratteri) che devono essere indicizzate, utilizza un'istanzaByteString.Proprietà del modello:
StringProperty bool-
Un valore booleano (
TrueoFalse).Proprietà del modello:
BooleanProperty intolong-
Un valore intero fino a 64 bit.
I valori di Python
intvengono convertiti in valori di Pythonlongprima dell'archiviazione. Un valore archiviato comeintverrà restituito comelong.Se viene assegnato un
longmaggiore di 64 bit, vengono memorizzati solo i 64 bit meno significativi.Proprietà del modello:
IntegerProperty float-
Un numero con virgola mobile.
Proprietà del modello:
FloatProperty datetime.datetime-
Una data e un'ora. Consulta la documentazione del modulo
datetime.Se il valore
datetimeha un attributotzinfo, verrà convertito nel fuso orario UTC per l'archiviazione. I valori vengono restituiti dal data store come UTC, con untzinfodiNone. Un'applicazione che ha bisogno che i valori di data e ora si trovino in un determinato fuso orario deve impostaretzinfocorrettamente durante l'aggiornamento del valore e convertire i valori nel fuso orario quando accede al valore.Alcune librerie utilizzano la variabile di ambiente
TZper controllare il fuso orario applicato ai valori data/ora. App Engine imposta questa variabile di ambiente su"UTC". Tieni presente che la modifica di questa variabile in un'applicazione non cambia il comportamento di alcune funzioni relative a data e ora, perché le modifiche alle variabili di ambiente non sono visibili al di fuori del codice Python.Se converti i valori solo verso e da un determinato fuso orario, puoi implementare un
datetime.tzinfopersonalizzato per convertire i valori dal data store:import datetime import time class Pacific_tzinfo(datetime.tzinfo): """Implementation of the Pacific timezone.""" def utcoffset(self, dt): return datetime.timedelta(hours=-8) + self.dst(dt) def _FirstSunday(self, dt): """First Sunday on or after dt.""" return dt + datetime.timedelta(days=(6-dt.weekday())) def dst(self, dt): # 2 am on the second Sunday in March dst_start = self._FirstSunday(datetime.datetime(dt.year, 3, 8, 2)) # 1 am on the first Sunday in November dst_end = self._FirstSunday(datetime.datetime(dt.year, 11, 1, 1)) if dst_start <= dt.replace(tzinfo=None) < dst_end: return datetime.timedelta(hours=1) else: return datetime.timedelta(hours=0) def tzname(self, dt): if self.dst(dt) == datetime.timedelta(hours=0): return "PST" else: return "PDT" pacific_time = datetime.datetime.fromtimestamp(time.mktime(utc_time.timetuple()), Pacific_tzinfo())
Consulta la documentazione del modulo
datetime(inclusodatetime.tzinfo). Consulta anche il modulo di terze partipytz, anche se tieni presente che la distribuzione dipytzcontiene molti file.La
DateTimePropertyclasse della proprietà del modello include funzionalità come la possibilità di utilizzare automaticamente la data e l'ora di archiviazione di un'istanza del modello. Si tratta di funzionalità del modello e non sono disponibili nel valore del datastore non elaborato (ad esempio in una proprietà dinamicaExpando).Proprietà del modello:
DateTimeProperty,DateProperty,TimeProperty list-
Un elenco di valori, ciascuno dei quali è di uno dei tipi di dati supportati.
Quando un
listviene utilizzato come valore di una proprietà dinamicaExpandonon può essere un elenco vuoto. Questo accade a causa del modo in cui vengono archiviati i valori dell'elenco: quando una proprietà elenco non contiene elementi, non ha alcuna rappresentazione nel datastore. Puoi utilizzare una proprietà statica e la classeListPropertyper rappresentare un valore di elenco vuoto per una proprietà.Proprietà del modello:
ListProperty -
db.Key -
La chiave di un'altra entità del data store.
Nota:le stringhe chiave sono limitate a un massimo di 1500 byte.
m = Employee(name="Susan", key_name="susan5") m.put() e = Employee(name="Bob", manager=m.key()) e.put() m_key = db.Key.from_path("Employee", "susan5") e = Employee(name="Jennifer", manager=m_key)
Proprietà del modello:
ReferenceProperty,SelfReferenceProperty -
blobstore.BlobKey -
La chiave di un valore dell'archivio BLOB, generata dall'archivio BLOB al momento del caricamento del valore.
Proprietà del modello:
blobstore.BlobReferenceProperty -
users.User -
Un utente con un Account Google.
Un valore
user.Usernel data store non viene aggiornato se l'utente cambia il proprio indirizzo email. Per questo motivo, ti consigliamo vivamente di evitare di memorizzare unusers.Usercome valoreUserProperty, in quanto include l'indirizzo email insieme all'ID univoco. Se un utente modifica l'indirizzo email e poi confronti il vecchiouser.Userarchiviato con il nuovo valoreuser.User, i valori non corrisponderanno. Utilizza inveceuser_id()del valoreuser.Usercome identificatore univoco stabile dell'utente.Proprietà del modello:
UserProperty - class Blob(arg=None)
-
Dati binari, come stringa di byte. Si tratta di una sottoclasse del tipo
strintegrato.Le proprietà blob non sono indicizzate e non possono essere utilizzate in filtri o ordini di ordinamento.
Blob è destinato ai dati binari, come le immagini. Richiede un valore
str, ma questo valore viene memorizzato come stringa di byte e non è codificato come testo. Utilizza un'istanzaTextper dati di testo di grandi dimensioni.Proprietà del modello:
BlobPropertyclass MyModel(db.Model): blob = db.BlobProperty() m = MyModel() m.blob = db.Blob(open("image.png", "rb").read())
In XML, i blob sono codificati in base 64, indipendentemente dal fatto che contengano o meno dati binari.
- class ByteString(arg)
-
Un valore blob breve ("stringa di byte") di massimo 1500 byte. ByteString è una sottoclasse di
str, e accetta un valorestrnon codificato come argomento del suo costruttore.I ByteString vengono indicizzati dal datastore e possono essere utilizzati nei filtri e negli ordini di ordinamento. Per stringhe di byte più lunghe di 1500 byte (che non sono indicizzate), utilizza un'istanza
Blob. Per i dati di testo codificati, utilizzastr(breve, indicizzato) oText(lungo, non indicizzato).Proprietà del modello:
ByteStringProperty - class Text(arg=None, encoding=None)
-
Una stringa lunga. Si tratta di una sottoclasse del tipo
unicodeintegrato.arg un valore
unicodeostr. Se arg è unstr, viene analizzato con la codifica specificata da encoding, oppureasciise non viene specificata alcuna codifica. Consulta l'elenco delle codificazioni standard per conoscere i possibili valori per encoding.A differenza di una proprietà entità il cui valore è un semplice
strounicode, una proprietà di testo può avere una lunghezza superiore a 1500 byte. Tuttavia, le proprietà di testo non vengono indicizzate e non possono essere utilizzate nei filtri o negli ordini di ordinamento.Proprietà del modello:
TextPropertyclass MyModel(db.Model): text = db.TextProperty() m = MyModel() m.text = db.Text(u"kittens") m.text = db.Text("kittens", encoding="latin-1")
- class Category(tag)
-
Una categoria o un "tag". Si tratta di una sottoclasse del tipo
unicodeintegrato.Proprietà del modello:
CategoryPropertyclass MyModel(db.Model): category = db.CategoryProperty() m = MyModel() m.category = db.Category("kittens")
In XML, si tratta di un elemento Atom
Category. - class Email(email)
-
Un indirizzo email. Si tratta di una sottoclasse del tipo
unicodeintegrato.Né la classe della proprietà né la classe del valore eseguono la convalida degli indirizzi email, ma memorizzano solo il valore.
Proprietà del modello:
EmailPropertyclass MyModel(db.Model): email_address = db.EmailProperty() m = MyModel() m.email_address = db.Email("larry@example.com")
In XML, si tratta di un elemento
gd:email. - class GeoPt(lat, lon=None)
-
Un punto geografico rappresentato da coordinate di latitudine e longitudine in virgola mobile.
Proprietà del modello:
GeoPtPropertyIn XML, si tratta di un elemento
georss:point. - class IM(protocol, address=None)
-
Un handle di messaggistica istantanea.
protocol è l'URL canonico del servizio di messaggistica istantanea. Alcuni valori possibili:
Protocollo Descrizione sip SIP/SIMPLE xmpp XMPP/Jabber http://aim.com/ AIM http://icq.com/ ICQ http://messenger.msn.com/ MSN Messenger http://messenger.yahoo.com/ Yahoo Messenger http://sametime.com/ Lotus Sametime http://gadu-gadu.pl/ Gadu-Gadu sconosciuto Sconosciuto o non specificato address è l'indirizzo dell'handle.
Proprietà del modello:
IMPropertyclass MyModel(db.Model): im = db.IMProperty() m = MyModel() m.im = db.IM("http://example.com/", "Larry97")
In XML, si tratta di un elemento
gd:im. - class Link(link)
-
Un URL completo. Si tratta di una sottoclasse del tipo
unicodeintegrato.Proprietà del modello:
LinkPropertyclass MyModel(db.Model): link = db.LinkProperty() m = MyModel() m.link = db.Link("http://www.google.com/")
In XML, si tratta di un elemento Atom
Link. - class PhoneNumber(phone)
-
Un numero di telefono leggibile. Si tratta di una sottoclasse del tipo
unicodeintegrato.Proprietà del modello:
PhoneNumberPropertyclass MyModel(db.Model): phone = db.PhoneNumberProperty() m = MyModel() m.phone = db.PhoneNumber("1 (206) 555-1212")
In XML, si tratta di un elemento
gd.phoneNumber. - class PostalAddress(address)
-
Un indirizzo postale. Si tratta di una sottoclasse del tipo
unicodeintegrato.Proprietà del modello:
PostalAddressPropertyclass MyModel(db.Model): address = db.PostalAddressProperty() m = MyModel() m.address = db.PostalAddress("1600 Ampitheater Pkwy., Mountain View, CA")
In XML, si tratta di un elemento
gd:postalAddress. - class Rating(rating)
-
Una valutazione fornita dall'utente per un contenuto, sotto forma di numero intero compreso tra 0 e 100. Si tratta di una sottoclasse del tipo
longintegrato. La classe convalida che il valore sia un numero intero compreso tra 0 e 100 e genera un messaggio di erroreBadValueErrorse il valore non è valido.Proprietà del modello:
RatingPropertyclass MyModel(db.Model): rating = db.RatingProperty() m = MyModel() m.rating = db.Rating(97)
In XML, si tratta di un elemento
gd:rating.
Classi di proprietà
Tutte le classi di proprietà del modello fornite da google.appengine.ext.db sono sottoclassi della classe di base
Property,
e supportano tutti gli argomenti del costruttore di base. Per informazioni su questi argomenti, consulta la documentazione della classe di base.
Il pacchetto google.appengine.ext.db fornisce le seguenti classi di proprietà del modello:
- class BlobProperty(...)
-
Una raccolta non interpretata di dati binari.
I dati blob sono una stringa di byte. Per i dati di testo, che possono comportare la codifica, utilizza
TextProperty.Tipo di valore:
Blob - class BooleanProperty(...)
-
Un valore booleano (
TrueoFalse).Tipo di valore:
bool - class ByteStringProperty(verbose_name=None, ...)
-
Un valore blob breve ("stringa di byte") di massimo 1500 byte.
I valori
ByteStringPropertysono indicizzati e possono essere utilizzati nei filtri e negli ordini di ordinamento.Come
StringProperty, a differenza che il valore non viene codificato in alcun modo. I byte vengono memorizzati in modo letterale.Se
ByteStringPropertyè obbligatorio, il valore non può essere una stringa vuota.Tipo di valore:
ByteString - class CategoryProperty(...)
-
Una categoria o un "tag", una parola o una frase descrittiva.
Tipo di valore:
Category - class DateProperty(verbose_name=None, auto_now=False, auto_now_add=False, ...)
-
Una data senza un'ora del giorno. Per ulteriori informazioni, consulta
DateTimeProperty.Tipo di valore:
datetime.date; convertito internamente indatetime.datetime - class DateTimeProperty(verbose_name=None, auto_now=False, auto_now_add=False, ...)
-
Una data e un'ora.
Se auto_now è
True, il valore della proprietà viene impostato sull'ora corrente ogni volta che l'istanza del modello viene memorizzata nel datastore, sovrascrivendo il valore precedente della proprietà. Questo è utile per monitorare la data e l'ora dell'ultima modifica di un'istanza del modello.Se auto_now_add è
True, il valore della proprietà viene impostato sull'ora corrente la prima volta che l'istanza del modello viene memorizzata nel data store, a meno che alla proprietà non sia già stato assegnato un valore. Questo è utile per memorizzare una data e un'ora "create" per un'istanza del modello.I valori data/ora vengono archiviati e restituiti utilizzando il fuso orario UTC. Consulta
datetime.datetimeper una discussione su come gestire i fusi orari.Tipo di valore:
datetime.datetime - class EmailProperty(...)
-
Un indirizzo email.
Né la classe della proprietà né la classe del valore eseguono la convalida degli indirizzi email, ma memorizzano solo il valore.
Tipo di valore:
Email - class FloatProperty(...)
-
Un numero con virgola mobile.
Tipo di valore:
float - class GeoPtProperty(...)
-
Un punto geografico rappresentato da coordinate di latitudine e longitudine in virgola mobile.
Tipo di valore:
GeoPt - class IMProperty(...)
-
Un handle di messaggistica istantanea.
Tipo di valore:
IM - class IntegerProperty(...)
-
Un valore intero fino a 64 bit.
I valori di Python
intvengono convertiti in valori di Pythonlongprima dell'archiviazione. Un valore archiviato comeintverrà restituito comelong.Se viene assegnato un
longmaggiore di 64 bit, vengono memorizzati solo i 64 bit meno significativi. - class LinkProperty(...)
-
Un URL completo.
Tipo di valore:
Link - class ListProperty(item_type, verbose_name=None, default=None, ...)
-
Un elenco di valori del tipo specificato da item_type.
In una query, il confronto di una proprietà dell'elenco con un valore esegue il test sugli elementi dell'elenco:
list_property=valueverifica se il valore compare in un punto qualsiasi dell'elenco,list_property<valueverifica se uno degli elementi dell'elenco è inferiore al valore specificato e così via.Una query non può confrontare due valori di elenco. Non è possibile verificare l'uguaglianza di due elenchi senza verificare separatamente l'appartenenza di ciascun elemento.
item_type è il tipo di elementi nell'elenco, come tipo o classe Python. Tutti gli elementi del valore dell'elenco devono essere del tipo specificato. tipo_elemento deve essere uno dei tipi di valore del data store e non può essere
list.Il valore di un
ListPropertynon può essereNone. Tuttavia, può essere un elenco vuoto. Quando viene specificatoNoneper l'argomento default (o quando l'argomento default non è specificato), il valore predefinito della proprietà è l'elenco vuoto.Suggerimento: poiché i tipi aggregati
ListPropertynon utilizzano le classiProperty, le funzionalità della classeProperty, come i valori automatici e la convalida, non vengono applicate automaticamente ai membri del valore dell'elenco. Se vuoi convalidare un valore dell'elemento utilizzando una classeProperty, puoi istanziare la classe e chiamare il relativo metodovalidate()sul valore.default è il valore predefinito per la proprietà dell'elenco. Se
None, il valore predefinito è un elenco vuoto. Una proprietà di elenco può definire un convalidatore personalizzato per non consentire l'elenco vuoto.Per ulteriori informazioni su proprietà e valori degli elenchi, consulta la pagina Modellazione dei dati.
Tipo di valore: un
listdi valori Python del tipo specificato - class PhoneNumberProperty(...)
-
Un numero di telefono leggibile.
Tipo di valore:
PhoneNumber - class PostalAddressProperty(...)
-
Un indirizzo postale.
Tipo di valore:
PostalAddress - class RatingProperty()
-
Una valutazione fornita dall'utente per un contenuto, sotto forma di numero intero compreso tra 0 e 100.
Tipo di valore:
Rating - class ReferenceProperty(reference_class=None, verbose_name=None, collection_name=None, ...)
-
Un riferimento a un'altra istanza del modello. Ad esempio, un riferimento può indicare una relazione many-to-one tra il modello con la proprietà e il modello a cui fa riferimento la proprietà.
reference_class è la classe del modello dell'istanza di modello a cui si fa riferimento. Se specificato, a questa proprietà possono essere assegnate solo istanze del modello della classe. Se
None, qualsiasi istanza del modello può essere il valore di questa proprietà.collection_name è il nome della proprietà da assegnare alla classe del modello a cui si fa riferimento. Il valore della proprietà è un valore
Queryper tutte le entità che fanno riferimento all'entità. Se non è impostato collection_name, viene utilizzatomodelname_set(con il nome del modello a cui si fa riferimento in lettere minuscole e_setaggiunto).Nota: collection_name deve essere impostato se nello stesso modello sono presenti più proprietà che fanno riferimento alla stessa classe di modello. In caso contrario, verrà generato un
DuplicatePropertyErrorquando vengono generati i nomi predefiniti.ReferencePropertyfa riferimento e dereferisce automaticamente le istanze del modello come valori delle proprietà: un'istanza del modello può essere assegnata direttamente a una proprietà di riferimento e verrà utilizzata la relativa chiave. Il valoreReferencePropertypuò essere utilizzato come se fosse un'istanza di modello e l'entità del datastore verrà recuperata e l'istanza di modello creata la prima volta che viene utilizzata in questo modo. Le proprietà di riferimento non toccate non eseguono query per dati non necessari.class Author(db.Model): name = db.StringProperty() class Story(db.Model): author = db.ReferenceProperty(Author) story = db.get(story_key) author_name = story.author.name author = db.get(author_key) stories_by_author = author.story_set.get()
Come per un valore
Key, è possibile che un valore della proprietà di riferimento faccia riferimento a un'entità di dati inesistente. Se un'entità a cui viene fatto riferimento viene eliminata dal data store, i riferimenti all'entità non vengono aggiornati. L'accesso a un'entità inesistente genera unReferencePropertyResolveError.L'eliminazione di un'entità non comporta l'eliminazione delle entità a cui fa riferimento una proprietà di riferimento.
Tipo di valore:
db.Key - class SelfReferenceProperty(verbose_name=None, collection_name=None, ...)
-
Un riferimento a un'altra istanza del modello della stessa classe (vedi
ReferenceProperty).Tipo di valore:
db.Key - class StringListProperty(verbose_name=None, default=None, ...)
-
Simile a una proprietà di elenco di valori
strounicode(basestring) di Python. - class StringProperty(verbose_name=None, multiline=False, ...)
-
Una stringa breve. Accetta un valore
strounicode(basestring) di Python di massimo 1500 byte.I valori
StringPropertysono indicizzati e possono essere utilizzati nei filtri e negli ordini di ordinamento.Se multiline è
False, il valore non può includere caratteri di avanzamento riga. La libreriadjangoformslo utilizza per applicare una differenza tra i campi di testo e i campi textarea nel modello di dati e altri possono utilizzarlo per uno scopo simile.Se la proprietà stringa è obbligatoria, il relativo valore non può essere una stringa vuota.
- class TextProperty()
-
Una stringa lunga.
A differenza di
StringProperty, un valoreTextPropertypuò avere una lunghezza superiore a 1500 byte. Tuttavia, i valoriTextPropertynon sono indicizzati e non possono essere utilizzati nei filtri o negli ordini di ordinamento.I valori
TextPropertymemorizzano il testo con una codifica di testo. Per i dati binari, utilizzaBlobProperty.Se la proprietà di testo è obbligatoria, il relativo valore non può essere una stringa vuota.
Tipo di valore:
Text - class TimeProperty(verbose_name=None, auto_now=False, auto_now_add=False, ...)
-
Un'ora del giorno senza una data. Accetta un valore
datetime.timedella libreria standard di Python. Per ulteriori informazioni, consultaDateTimeProperty.Tipo di valore:
datetime.time; convertito internamente indatetime.datetime - class UserProperty(verbose_name=None, auto_current_user=False, auto_current_user_add=False, ...)
-
Importante: ti consigliamo vivamente di non memorizzare un
UserProperty, poiché include l'indirizzo email e l'ID univoco dell'utente. Se un utente cambia il proprio indirizzo email e confronti il vecchioUsermemorizzato con il nuovo valoreUser, i valori non corrisponderanno.Un utente con un Account Google.
Se auto_current_user è
True, il valore della proprietà viene impostato sull'utente che ha eseguito l'accesso corrente ogni volta che l'istanza del modello viene memorizzata nel data store, sovrascrivendo il valore precedente della proprietà. Questo è utile per monitorare quale utente modifica un'istanza del modello.Se auto_current_user_add è
True, il valore della proprietà viene impostato sull'utente che ha eseguito l'accesso al momento la prima volta che l'istanza del modello viene memorizzata nel data store, a meno che alla proprietà non sia già stato assegnato un valore. Questo è utile per monitorare l'utente che crea un'istanza del modello, che potrebbe non essere lo stesso che la modifica in un secondo momento.UserProperty non accetta un valore predefinito. I valori predefiniti vengono impostati alla prima importazione della classe del modello e, con la memorizzazione nella cache dell'importazione, potrebbero non essere quelli dell'utente che ha eseguito l'accesso.
Tipo di valore:
users.User