Як зробити поле багато-багато-необов’язковим у Django?


202

Коли у вас є багато-багато-багато відносин ( related_name, ні through) і ви намагаєтеся використовувати інтерфейс адміністратора, вам потрібно ввести одне з відносин, навіть якщо він не повинен існувати для вас, щоб створити перший запис.

Я створюю додаток, який є організатором подій. Уявіть, у нас були Eventі Groupмоделі, пов'язані між собою багато хто.

Джанго related_nameстворює ще одну таблицю з індексами двох інших таблиць.
Але я не бачу причин , чому ця додаткова таблиця має заселятися.

Якщо я працюю з базою даних через phpMyAdmin, я можу створити Groupбез реєстрації Event, оскільки з'єднання між ними відбувається лише через окрему таблицю, і на даному рівні немає примусового використання бази даних.

Як змусити адміністраторський інтерфейс це зрозуміти?
Як зробити поле "багато на багато" необов'язковим у Django?

Відповіді:


348

Якщо ви хочете мати змогу вказати співвідношення ManyToMany, не вимагаючи цього, просто скористайтеся blank=True:

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

7
Це все-таки вирішує проблему. Використання порожнього не було для мене очевидним, тому що я думав, що багато хто створив таблицю, яка пов'язує події з групами (події = моделі. пустий, оскільки подія насправді не є полем у груповій таблиці. Так чи інакше воно працювало, тобі дякую !!!
ДЗ.

9
@omouse Я думаю, що так, порожнє - для перевірки django, а null - для бази даних. У такому випадку (як, наприклад, у IntegerField) немає сенсу ставити одне без іншого, я думаю
lajarre

17
Вам справді потрібно мати null=True? Я був під враженням, що nullце не впливає на ManyToManyполя: stackoverflow.com/questions/18243039/…
Tyler Hayes

5
Так, гм @ TylerHayes вірно. null = True в основному є неоперативним і є безглуздим у контексті ManyToMany. Я відкритий для того, щоб мені показали, як я помиляюся.
Бен Робертс

7
null = True не потрібно, принаймні від Django 1.5.
Віль Лорікарі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.