2016-02-10 10 views
7

Un cliente desidera aggiungere campi personalizzati a un modello django che forniamo.Aggiunta di campi personalizzati a un modello django (senza modifiche nel codice sorgente)

Vuole farlo da solo, senza programmazione.

Queste cose dovrebbero essere cumulabili:

  • booleano (sì/no) campi. "unset"
  • campi di scelta singola opzionali
  • più campi a scelta
  • singoli campi di testo linea
  • campi textarea
  • data

Esempio:

il cliente vuole aggiungi un campo che chiama "ha avuto successo". E il campo> dovrebbe avere queste scelte: sì/no/unset. Impostazione predefinita da disinserire.

Le cose sarebbero facili se potessi farlo creando o estendendo un modello. Ma in questo caso nessuna modifica al codice sorgente sono consentiti :-(

Come risolvere questo

Aggiornamento

Interrogazione per le istanze con valori dati deve essere supportato Esempio:?. Mostra tutti i casi in cui "ha avuto successo" è vera.

+1

Quando si dice il codice sorgente cambia ... surel Accettate che qualcosa debba cambiare per qualcosa da aggiungere? è un 'JSONField' abbastanza? – Sayse

+0

Ho aggiornato la domanda. Le query devono essere supportate. Non sono sicuro se un JSONField supporta questo. – guettli

+1

Sembra più un caso in cui ciò che il cliente sta chiedendo non è in realtà ciò che vogliono. Sarei molto scettico sul fatto che qualsiasi entità esterna regni liberamente su ciò che potrebbe contaminare il mio database con – Sayse

risposta

0

Se questo è davvero quello che vuoi.

  1. Crea e campi inesistenti di cui il tuo cliente ha sempre bisogno.

    boolean_field_1 = models.BooleanField(..) 
    boolean_field_2 .. 
    date_field_1 = .. 
    date_field_2 = .. 
    
  2. Archiviare alias mapping da qualche parte.

    Potrei aggiungere un campo per la mappatura alias.

    json_mapping_field = JSONField() 
    # this has is_successful: boolean_field_1 
    
  3. Poi trovare luoghi in cui è possibile sostituire l'alias di nuovo al vero nome del campo

    per semplice filtro e l'aggiornamento, si potrebbe ignorare

    1. QuerySet.filter Queryset.exclude
    2. QuerySet.update, UpdateQuery.add_update_values ​​
    3. infine utilizzare from_queryset affinché il proprio gestore utilizzi QuerySet nascosto.
+0

Ok, questo potrebbe funzionare. Ma forse potresti creare un Modello per ogni tipo di dati invece di "boolean_field_1", "boolean_field_2", ... Background: Forse un cliente vuole 20 boolean_fields ... – guettli

+0

Oppure potresti pensare a un diverso schema di distribuzione dei possibili campi. Se questo è per l'app questionario, il cliente potrebbe avere l'idea del tipo di domande che hanno * criteri di campo * diversi *. Si può distribuire un insieme arbitrario di campi alle tabelle finché si può avere una regola di mappatura. – eugene

+0

Si potrebbe anche avere una tabella per 10 booleans max e 100 booleans max, e usare 10 se ha bisogno di meno di 10 o 100. (Fino a quando è possibile implementare le regole di mappatura al punto 3) – eugene

2

io uso Django Dynamic Forms. Fuori dagli schemi, consente agli utenti di creare i propri moduli tramite l'amministratore. Potresti voler estenderlo per costruire un'interfaccia utente più user-friendly, ma questo dovrebbe portarti molto lontano.Supporta

  • booleani
  • scelte (selezionare)
  • scelte multiple (multiple selezionare)
  • data
  • datetime
  • tempo
  • email
  • intero
  • singola linea testo
  • a più di testo della linea
7

È possibile creare una tabella che segue la EAV principle (Entity Attributo Valore). Fondamentalmente si tratta di una tabella denormalizzato con i seguenti colonne:
[ID (e/o Slug), float_value, integer_value, string_value] (aggiungere ulteriori colonne di questa tabella)

Ora dicono che hai una tabella esistente chiamato "Stati ". Quando il cliente aggiunge un campo dinamico tramite l'interfaccia utente, aggiungi qui le voci e usa "ID" per cercarle per un determinato membro.

2

Bene, quando ho avuto questo problema, ho usato per creare un modello di campo personalizzato, con un campo nome e un campo tipo, di solito un campo di scelta con scelte per i possibili tipi di campo. È anche possibile aggiungere un campo is_active per filtrare i campi personalizzati attivi e inattivi.

Quindi, quando creo il for, cerco questi oggetti per sapere quali campi devo avere in quella forma.

Per memorizzare i dati, avrei un altro modello, chiamato CustomFieldAnswer, o qualcosa del genere. Questo modello dovrebbe avere un ForeignKey per il modello principale che dovrebbe avere questi dati e il campo personalizzato.

Così facendo, è possibile avere dinamicamente qualsiasi tipo di campo per il proprio modello e senza che il client debba codificare nulla.

È possibile utilizzare metaprogramming per creare campi acutuali in un modulo basato sulla query nei campi personalizzati. Oppure, puoi semplicemente inserire i campi nel modello e modificare il tipo di input per ciascun campo personalizzato.

Spero che questo aiuti!

0

So che sembra un tremendo trucco, ma forse è possibile creare un'interfaccia che crei file di testo?

  1. Un file sarebbe models.py, con definizioni del modello, ed escludendo questo modello da migrazioni con managed = False
  2. Un altro file è la SQL con DROP e CREATE TABLE se il cliente vuole una nuova tabella, o semplicemente ALTER tavolo.
  3. Un altro script può eseguire lo script SQL, copiare il file models.py nella directory corretta e ricaricare django.
+0

Giù per votare? È una domanda non comune, che richiede soluzioni non comuni. –

0

Ho appena scoperto, che c'è anche una griglia di confronto su djangopackages su questo:

https://www.djangopackages.com/grids/g/dynamic-models/

Intestazione:

applicazioni per aggiungere i campi ai modelli nelle impostazioni, o anche in fase di esecuzione.

Qualche amministratore di StackOverflow ha eliminato questa risposta, ecco perché lo scrivo di nuovo.

Motivo della cancellazione era:

Mentre questo link può rispondere alla domanda, è meglio includere le parti essenziali della risposta qui e fornire il link di riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.

Qui ci sono i pacchetti attuali che sono elencati sulla griglia di confronto di oggi:

+0

Ti prego, dimmi perché questa risposta viene rifiutata. Non è una risposta solo per collegamento. – guettli

Problemi correlati