Ho due classi del modello Django:aggiungendo lo stesso oggetto due volte per un ManyToManyField
class A(models.Model):
name = models.CharField(max_length = 128) #irrelevant
class B(models.Model):
a = models.ManyToManyField(A)
name = models.CharField(max_length = 128) #irrelevant
Quello che voglio fare è il seguente:
a1 = A()
a2 = A()
b = B()
b.a.add(a1)
b.a.add(a1) #I want to have a1 twice
b.a.add(a2)
assert len(b.a.all()) == 3 #this fails; the length of all() is 2
sto indovinando che aggiungono() utilizza un impostare semantico, ma come posso aggirare questo? Ho provato a controllare i gestori personalizzati, ma non sono sicuro se questo sia il modo giusto (sembra complicato) ...
Grazie in anticipo!
Penso che non sia del tutto corretto. La relazione da A a B è realizzata tramite una tabella delle relazioni composta da tre colonne: id, a_id e b_id. id è la chiave primaria di quella tabella, quindi sarebbe OK avere tre righe in quella tabella dove due hanno la stessa voce rispettivamente per a_id e b_id. E questo è quello che voglio, ma non riesco a capire come dire a Django che ... – qollin
@qolin, la risposta di sos-skil ti offre un modo per creare un tale tavolo (non attraverso molti ovviamente) - la mia idea è solo di aggiungere un campo count a quel tavolo piuttosto che fare affidamento su duplicati (è solo un modo più compatto implementare i multisets aka bags). –
@qollin: non sono sicuro che si possa fare affidamento sul fatto che ci sia sempre un id nella tabella delle relazioni, che potrebbe essere un dettaglio di implementazione. E puoi costruire un numero molti-a-molti usando una tabella "attraverso" che può avere colonne aggiuntive, come il campo di conteggio suggerito da Alex. –