Django ManyToMany альтернатива плюсы и минусы
Я разрабатывал систему чата с каналами и имею эти модели для потока (некоторые атрибуты удалены для простоты) :
class Thread(models.Model):
name = models.CharField(max_length=50, null=True, blank=True)
users = models.ManyToManyField('auth.User')
Я понял, что это также можно реализовать следующим образом:
class Thread(models.Model):
name = models.CharField(max_length=50, null=True, blank=True)
class ThreadUsers(models.Model):
thread = models.ForeignKey(Thread, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
Каковы преимущества/недостатки использования одного из них по сравнению с другим?
Все, что вы делаете - то же самое. Для вашего последнего примера с пользовательским M2M через модель вы можете добавить M2M объявление users
в Thread:
class Thread(models.Model):
name = models.CharField(max_length=50, null=True, blank=True)
# M2M declaration, which use your ThreadUsers
users = models.ManyToManyField('auth.User', through='ThreadUsers' )
class ThreadUsers(models.Model):
thread = models.ForeignKey(Thread, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
Плюсы:
- Вы создаете модель self
- Вы можете изменить поведение Вашего M2M соединения вручную.
- Вы можете добавить дополнительные поля в M2M через соединение.
- У вас есть полный контроль над этой моделью. Минусы
- проблема с m2m соединениями в админке django.
- слишком много дополнительного кода, вы можете получить труднонаходимые ошибки.
- некоторые поля/виджеты не хотят работать с M2M.through.
- все произошедшее - ваша проблема, это не тестировалось. Отношения автопрохождения тестируются в коробке.
в наших проектах 50/50 M2M-autothrough vs M2M-manualthrough. если я хочу иметь больше контроля над моделями и реалиями - я использую custom through.
p.s. в случае M2M-autothrough Django создал модель SomethingLikeYourThreadUsers и таблицу автоматически.