【问题标题】:Proper ways to do MySQL multiple joinMySQL多重连接的正确方法
【发布时间】:2019-06-13 17:54:29
【问题描述】:

MySQL 版本:5.7

你好。我正在开发一个新的 django 项目。

与此同时,

我带了两张桌子。

Auth(1st Table) 包含用户数据(如 id、电子邮件、密码、姓名等)

Paper(2st Table) 包含研究论文信息。

Paper 表有 10 列用于用户权限。只有 10 个用户可以阅读论文,所以我有一个表格的模型,例如;

class DocDetail(models.Model):
    no = models.AutoField(primary_key=True)
    doc_id = models.CharField(null=False, default="", max_length=255)
    doc_name = models.CharField(null=False, default="", max_length=255)
    doc_pw = models.CharField(null=False, default="", max_length=255)
    view_perm_1 = models.IntegerField(null=True)
    view_perm_2 = models.IntegerField(null=True)
    view_perm_3 = models.IntegerField(null=True)
    view_perm_4 = models.IntegerField(null=True)
    view_perm_5 = models.IntegerField(null=True)
    view_perm_6 = models.IntegerField(null=True)
    view_perm_7 = models.IntegerField(null=True)
    view_perm_8 = models.IntegerField(null=True)
    view_perm_9 = models.IntegerField(null=True)
    view_perm_10 = models.IntegerField(null=True)
    folder = models.CharField(null=False, default="", max_length=255)
    url = models.CharField(null=False, default="", max_length=255)
    status = models.IntegerField(null=True)
    action_exp = models.DateTimeField(null=True)
    date_updated = models.DateTimeField(null=True)

view_perm 列表示 Auth Table 的 user_id。

我想通过 1 个查询选择 Paper 表的所有列和链接到每个 view_perm 列的用户数据。

我认为我在建模方面大错特错。

我可以使用 10 个连接进行选择,但它看起来不正确。 有没有更好的办法来实现这一点?

我对 SQL 很陌生,所以请指导我正确的方向。

【问题讨论】:

  • 我不能说 Django,但从关系的角度来看,这十列是错误的。正确的方法是使用一个额外的表格来链接用户和论文。

标签: mysql django django-models


【解决方案1】:

这是各种错误。

首先,您应该在任何情况下都绝对不要定义您自己的身份验证。使用 Django 的。 (无论如何,定义一个自定义 User 模型,只要它继承自 AbstractBaseUser 并因此使用内置功能来存储和检查密码。)

其次,在定义模型之间的关系时,必须使用关系字段,而不是整数。在 Django 中,它们是 ForeignKey、OneToOneField 和 ManyToManyField。在您的情况下,您似乎具有多对多关系,因此请使用 ManyToManyField。

这也解决了您的另一个问题,因为(在幕后)将多对多关系定义为将用户 ID 连接到页面 ID 的链接表。所以所有的 JOIN 都为你完成了。

您的模型应如下所示:

class DocDetail(models.Model):
    no = models.AutoField(primary_key=True)
    doc_id = models.CharField(default="", max_length=255)
    doc_name = models.CharField(default="", max_length=255)
    doc_pw = models.CharField(default="", max_length=255)
    users = models.ManyToManyField('auth.User')
    folder = models.CharField(default="", max_length=255)
    url = models.CharField(default="", max_length=255)
    status = models.IntegerField(null=True)
    action_exp = models.DateTimeField(null=True)
    date_updated = models.DateTimeField(null=True)

(我还删除了所有null=False,因为这是默认设置。)

现在给定一个 DocDetail 实例,您可以通过以下方式获取允许的用户:

my_doc_detail.users.all()

【讨论】:

  • 你好丹尼尔。感谢你的回答。我已经解决了这个问题。你是和我一样处于学习阶段的人的光。我还从stackoverflow.com/questions/1182380/… 那里得到了一些提示,这也是你的答案之一。谢谢!!
猜你喜欢
  • 1970-01-01
  • 2023-01-03
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
相关资源
最近更新 更多