mysql - 进行 MySQL 多重连接的正确方法

标签 mysql django django-models

MySQL 版本:5.7

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

与此同时,

我带了两张 table 。

Auth(第一个表)包含用户数据(如 ID、电子邮件、密码、姓名等)

论文(第二个表)包含研究论文信息。

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 表的 user_id。

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

我认为我在建模方面有很大的错误。

我可以使用 10 个连接进行选择,但看起来不正确。 有没有更好的主意来让它发挥作用?

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

最佳答案

这是完全错误的。

首先,您应该在任何情况下都绝对不定义自己的身份验证。使用 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()

关于mysql - 进行 MySQL 多重连接的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56586100/

相关文章:

django-lfs "No module named appconf"

java - 如何获取 'news_base'表的id?

Mysql查询连接多个表的数据

python - Django 无法在模板中计算票数

python - Django 南 : detecting if fake migrations were applied in production

python - 如何在 Google App Engine 柔性环境中编辑 NGINX 配置?

mysql - 使用 RegisterReaderHandler 在 mysql 中插入行

php - 产品表中各个零售商的同类产品价格比较结果

python-3.x - 从 ABC 和 django.db.models.Model 继承会引发元类异常

django - 如何在Django的model.save()中检测模型的新实例