Jak ustawić opcjonalne pole wiele do wielu w Django?


202

Jeśli masz relację wiele do wielu ( related_namenie through) i próbujesz użyć interfejsu administratora, musisz wprowadzić jedną z relacji, nawet jeśli nie musi ona istnieć, aby utworzyć pierwszy wpis.

Tworzę aplikację, która jest organizatorem wydarzeń. Wyobraź sobie, że mieliśmy Eventi Groupmodelki, związani relacją wielu do wielu.

Django related_nametworzy kolejną tabelę z indeksami dwóch pozostałych tabel.
Ale nie widzę powodu, dla którego ten dodatkowy stolik musi być wypełniony.

Jeśli pracuję z bazą danych przez phpMyAdmin, mogę utworzyć Groupbez rejestracji Event, ponieważ połączenie między nimi odbywa się tylko poprzez osobną tabelę i nie ma wymuszania wartości bazy danych na danym poziomie.

Jak sprawić, by interfejs administratora to zrealizował?
Jak ustawić opcjonalne pole wiele do wielu w Django?

Odpowiedzi:


348

Jeśli chcesz mieć możliwość określenia relacji ManyToMany, nie wymagając jej, po prostu użyj blank=True:

class Group(models.Model):
    ...
    events = models.ManyToManyField(Event, blank=True)

7
To rozwiązuje problem. Używanie pustego miejsca nie było dla mnie tak oczywiste, ponieważ myślałem, że wielu stworzyło tabelę, która łączy zdarzenia z grupami (zdarzenia = modele. puste, ponieważ Event nie jest właściwie polem w tabeli grupowej. W każdym razie zadziałało, więc dziękuję !!!
DZ.

9
@omouse Myślę, że tak, puste miejsce to walidacja django, a null dla bazy danych. W takim przypadku (jak w przypadku IntegerField) nie ma sensu umieszczać jednego bez drugiego, myślę
lajarre

17
Czy naprawdę potrzebujesz null=True? Byłem pod wrażeniem, nullże nie ma to żadnego wpływu na ManyToManypola: stackoverflow.com/questions/18243039/...
Tyler Hayes

5
Tak, um @TylerHayes ma rację. null = True to w zasadzie brak operacji i jest nonsensowny w kontekście ManyToMany. Jestem otwarty na pokazanie, jak się mylę.
Ben Roberts,

7
null = Prawda nie jest wymagana, przynajmniej od wersji Django 1.5.
Ville Laurikari,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.