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 и таблицу автоматически.

Вернуться на верх