我正在开发一个带有频道的聊天系统,并为一个线程创建了这个模型(为了简单起见,删除了一些属性(:
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模型和表。