2009-09-30 15 views
50

Una delle cose che mi infastidisce sulle apparecchiature Django è che devi specificare la chiave primaria di ogni modello. C'è un modo per creare proiettori senza dover specificare una chiave primaria per ogni riga?Django: crea proiettori senza specificare una chiave primaria?

+0

stai usando manage.py --dumpdata o scrivendoli a mano? –

+0

Scrivendoli a mano –

risposta

75

Usa "pk: null" invece di "pk: 1" (o qualsiasi altra cosa), che si tradurrà in PK essere impostato su Nessuno, e quando il oggetto è salvato verrà assegnata una chiave primaria.

Questo funziona almeno per YAML, suppongo che lo stiate usando se si sta creando a mano.

+18

Devi stare attento quando usi dispositivo pk-less. Quando si richiama loaddata, proverà ad aggiungere nuove voci invece di sovrascrivere quelle esistenti. – Danosaure

+1

spookylukey o @Danosaure Esiste un modo per generare fixture "pk: null" usando manage.py dumpdata? Sto consolidando due DB con schemi identici e sto lavorando su come farlo con dumpdata/loaddata –

+1

@BenRoberts Il problema con pk: null è che potresti finire con i duplicati. Di solito, semplicemente dumpdata e vi il file per fare questo genere di cose. – Danosaure

0

Un mio amico ha suggerito modulo fixture: http://farmdev.com/projects/fixture/

+0

Sembra uno stack equo del codice boilerplate con cui lavorare. Il mio flusso di lavoro per generare dati da testare è spesso quello di utilizzare l'interfaccia di amministrazione per creare dati, quindi utilizzare la makefixture di django-test-utils per scaricarlo in un file e quindi (se necessario) annullare qualsiasi voci pk –

13

si dovrebbe avere uno sguardo alle chiavi naturale se stai hanno voglia aggiungere relazione senza l'utilizzo di pk

https://docs.djangoproject.com/en/dev/ref/django-admin/#dumpdata-app-label-app-label-app-label-model

+7

Purtroppo, il i documenti sulle chiavi naturali non menzionano il trucco pk = null usato in precedenza.È necessario che entrambi i pk = null e le chiavi naturali abbiano un dispositivo completamente privo di memoria – Cerin

+0

Sfortunatamente quel collegamento non funziona più.Ecco quello che funziona oggi, vediamo se dura più di 3 anni: https://docs.djangoproject.com/en/dev/ref/django-admin/#dumpdata-app-label-app-label-app-label-model –

0

ho avuto a che fare con lo schema DB esistente senza possibilità di cambiare, quindi ho bisogno di un tabella con chiave primaria complessa o senza affatto - ma non con quella seriale. Quello che ho fatto:

ho specificato un primary_key = True al campo, che non dovrebbe essere unico metodo a tutti e ha scritto sovraccarico:

class ContraIndicationsMedicines(models.Model): 

    contra_indication = models.ForeignKey(ContraIndication, primary_key=True) 
    medicine = models.ForeignKey(Medicine) 

    def validate_unique(self, exclude=None): 
     pass 

In effetti, ha funzionato per le mie esigenze, ma ci sono più chiamate di convalida all'interno di django.contib.admin. * e non tutte le inline ecc sono garantite per funzionare. Questa era l'unica soluzione che potevo implementare ... ((

0

Se si controlla il comando dumpdata manage.py, verranno visualizzate alcune opzioni chiamate --natural-foreign, --natural-primary. all'uscita puoi vedere che gli oggetti vengono scaricati senza usare chiavi primarie o chiavi esterne

Problemi correlati