mam dwie klasy modelu Django:dodając ten sam obiekt dwa razy do 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
Co chcę zrobić jest następujący:
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
Jestem zgadywania, że add() używa ustawić semantyczną, ale jak mogę to obejść? Próbowałem zajrzeć do niestandardowych menedżerów, ale nie jestem pewien, czy to właściwa droga (wydaje się skomplikowana) ...
Z góry dziękuję!
Myślę, że to nie do końca poprawne. Relacja od A do B jest realizowana za pomocą tabeli relacji składającej się z trzech kolumn: id, aid i b_id. id jest kluczem podstawowym tej tabeli, więc byłoby dobrze mieć trzy wiersze w tej tabeli, gdzie dwa mają ten sam wpis odpowiednio dla aid i b_id. I tego właśnie chcę, ale nie mogę wymyślić, jak powiedzieć Django, że ... – qollin
@qolin, odpowiedź sos-skil oferuje sposób na zrobienie takiego stołu (oczywiście nie przez wiele stron) - moim pomysłem jest dodanie pola licznika do tego stołu zamiast polegania na duplikatach (to tylko bardziej zwarty sposób do wdrażania multiseksów, a także toreb). –
@qollin: Nie jestem pewien, czy możesz polegać na tym, że zawsze istnieje identyfikator w tabeli relacji - może to być szczegół implementacji. Możesz zbudować wiele-do-wielu używając tabeli "do", która może zawierać dodatkowe kolumny, takie jak pole liczenia, które zasugerował Alex. –