MySQL版本:5.7
你好我正在开发一个新的Django项目。
与此同时,
我带来了2张桌子。
Auth(第一表)包含用户数据(例如ID,电子邮件,密码,名称等)
论文(第2表)包含研究论文信息。
“纸张”表有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列指示验证表的user_id。
我想选择通过1个查询链接到每个view_perm列的Paper表和用户数据的所有列。
我认为建模几乎是错误的。 我可以选择10个联接,但是看起来不对。 有什么更好的主意可以做到这一点吗?
我对SQL还是很陌生,所以请指导我正确的方向。
答案 0 :(得分:0)
这是各种各样的错误。
首先,您绝对不要在任何情况下定义自己的身份验证。使用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()