繁体   English   中英

Django 多对多替代优缺点

[英]Django ManyToMany alternative pros and cons

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

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)

使用其中一种的优点/缺点是什么?

你所做的一切——都是一样的。 对于通过 model 自定义 M2M 的最后一个示例,您可以在线程中添加 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)

优点:

  • 您自己创建 model
  • 您可以手动更改 M2M 连接的行为。
  • 您可以通过连接在 M2M 中添加其他字段。
  • 您可以完全控制此 model。 缺点
  • django 管理员中的 m2m 连接问题。
  • 额外的代码太多,你会得到一个难以发现的错误。
  • 某些字段/小部件不想与 M2M.through 一起使用。
  • 发生的一切都是你的问题,这是未经测试的。 自动通过关系在框中进行测试。

我们的项目中有 50/50 M2M-autothrough 与 M2M-manualthrough。 如果我想对模型和现实有更多的控制 - 我使用自定义。

ps 在 M2M-autothrough 案例 Django 中自动创建了 SomethingLikeYourThreadUsers Model 和 Table。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM