Django ManyTo许多其他的优点和缺点



我正在开发一个带有频道的聊天系统,并为一个线程创建了这个模型(为了简单起见,删除了一些属性(:

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直通模型的最后一个示例,您可以在Thread:中添加M2M声明users

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)

优点

  • 您自己创建模型
  • 您可以手动更改M2M连接的行为
  • 您可以通过连接在M2M中添加其他字段
  • 你完全可以控制这个模型

缺点

django管理中m2m连接的
  • 问题
  • 额外的代码太多,你可能会得到一个很难找到的错误
  • 一些字段/小部件不希望使用M2M.through
  • 所发生的一切都是你的问题,这还没有经过测试。自动通过关系在框中测试

我们的项目中有50/50 M2M自动通道与M2M手动通道。如果我想对模型和现实有更多的控制权,我会使用custom-through。

p.s.在M2M自动穿透案例中,Django自动创建了SomethingLikeYourThreadUsers模型和表。

最新更新