2015-07-09 13 views
6

Sviluppo una determinata applicazione, che ho trovato con il database e lo schema modello specificati. Sto usando la versione 1.8.2 di Django. Di seguito viene presentato un problema. I campi non necessari sono stati omessi, i nomi dei modelli sono inventati ai fini di un esempio, perché non posso rivelarli. Si consideri il seguente modelli A e B.Come creare una chiave primaria composta da due campi in Django?

class B (models.Model): 

     name = models.CharField(max_length=100) 

class A (models.Model): 

     name = models.CharField(max_length=100, primary_key=True) 
     related_name = models.ForeignKey(B, null=True, blank=True) 

Dopo un lungo periodo di tempo un progetto la possibilità che ci possano essere diversi con lo stesso nome A, ma con diversa chiave esterna B. In questo caso particolare, vorrei modellare la chiave primaria "A" è composta da due campi: nome e nome correlato. Come creare una chiave del genere consiste in due campi in django?

+0

è possibile modificare la chiave primaria di 'A' come predefinito Django' id' invece? Sembra una soluzione ovvia. –

+0

Ciao :-) Grazie per la risposta. Questa è una buona soluzione, ma nel mio caso molte tabelle hanno come tabella delle chiavi esterne "A" e il passaggio all'ID predefinito sarebbe un grande sforzo. Inoltre, un sacco di codice che utilizza query come "A.objects.get (pk =" something ")" e modifica il tipo di chiave primaria richiede molto lavoro. Per questo motivo, sto cercando una soluzione che non cambia il tipo di chiave. La base ha molti anni. –

+0

Ok. In tal caso, non penso che questo possa essere risolto in django. Django richiede una singola chiave primaria unica per ogni istanza. Anche se si potesse usare una chiave primaria composta, non sono sicuro se sia una buona idea quando uno dei campi nel pk è una chiave straniera nullable. –

risposta

3

Si desidera utilizzare una chiave composita. Django non supporta questo See here. C'è un po 'di supporto ma non puoi avere relazioni quindi è abbastanza limitato per quanto riguarda l'uso pratico.

Currently Django models only support a single column in this set, denying many designs where the natural primary key of a table is multiple columns. Django currently can't work with these schemas; they must instead introduce a redundant single-column key (a “surrogate” key), forcing applications to make arbitrary and otherwise-unnecessary choices about which key to use for the table in any given instance.

2

Django non supporta i tasti compositi. Ma è possibile utilizzare unique-together

unique_together = ("name", "related_name") 
+0

Quando userei unique_together, assumendo che i modelli sembrino come presentati nella domanda. Dopo l'aggiunta del modello meta-class A unique_together = ("nome", "related_name"), potrei avere due righe di nome = "Kriss" diverso nome correlato al campo? Quello che intendo è che il parametro name field primary_key è impostato su true. –

+0

>>> s = B.objects.create (name = "JAN") >>> s.save() >>> d = A.objects.create (name = "Stasze") >>> d .save() >>> k = A.objects.create (name = "Stasze", related_name = s) return Database.Cursor.execute (self, query, params) django.db.utils.IntegrityError: UNIQUE vincolo fallito: test_comp_a.name –

+0

* Non è un PK composito *, ricordalo. Stai usando l'attributo 'name' nella classe' A' come PK e creando un oggetto ripetuto. Se avrai lo stesso 'nome' in molti oggetti' A', non usarlo come PK, usa un 'autoincrement' come predefinito e il' unique_together' farà il trucco. – Gocht

Problemi correlati