【问题标题】:Django ORM - model referencing another models ManyToMany fieldDjango ORM - 模型引用另一个模型ManyToMany字段
【发布时间】:2019-09-04 15:35:09
【问题描述】:

我目前正在尝试在 djangos ORM 中设置一些数据库模型。但是我无法弄清楚我应该如何引用另一个模型多对多字段。

项目模型

class Project(models.Model):
    projectName = models.CharField(max_length=200)
    users = models.ManyToManyField(get_user_model())
    projectOwner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name='projectowner', default=1)

users = models.manytomanyfield(get_user_mode()) 工作正常 并在数据库中生成正确的关系。 现在我想添加一个新模型,在权限和 project_user 之间添加多对多关系 那么最终结果表应该是什么样子:

project:
projectname - string
projectowner - id of referenced user

user: django orm auth user model

rights:
name
description
etc

project_user:
id
project_id
user_id

rights_projectuser:
id
rights_id
project_user_id

现在最后一个 (rights_projectuser) 是我不知道如何制作的。

【问题讨论】:

    标签: django orm


    【解决方案1】:

    您需要将“project_user”转换为through model,然后您可以添加多对多关系。

    class Project(models.Model):
        projectName = models.CharField(max_length=200)
        users = models.ManyToManyField(get_user_model(), through='ProjectUser')
    
    class ProjectUser(models.Model):
        project = models.ForeignKey(Project, on_delete=models.CASCADE)
        user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
        rights = models.ManyToManyField(Right)
    

    【讨论】:

    • 如果我要运行该代码,我最终不会在项目和用户之间建立 2 个多对多关系吗? 1 来自模型项目:users = models.manytomany 和 1 来自 projectuser 本身,哦,nvm 我猜这就是 through='ProjectUser' 所做的
    【解决方案2】:

    我现在在运行此代码时遇到以下问题:

    from django.db import models
    from django.contrib.auth import get_user_model
    
    User = get_user_model()
    
    class Project(models.Model):
        projectName = models.CharField(max_length=200)
        users = models.ManyToManyField(get_user_model(), through='ProjectUser')
        projectOwner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name='projectowner', default=1)
    
    class Right(models.Model):
        name = models.CharField(max_length=200)
        description = models.CharField(max_length=1000)
    
    class ProjectUser(models.Model):
        user_id = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
        project_id = models.ForeignKey(Project, on_delete=models.CASCADE)
        rights = models.ManyToManyField(Right)
    

    ValueError:无法将字段 wspingpong.Project.users 更改为 wspingpong.Project.users - 它们不是兼容的类型(您无法更改 M2M 字段或从 M2M 字段更改,或通过 = 在 M2M 字段上添加或删除)

    【讨论】:

    • 如果您不关心删除数据,那么这个答案应该对stackoverflow.com/a/39223849/548562 有所帮助。如果您确实关心数据,则需要以某种方式手动导出/导入数据
    • 修复了,谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 2023-02-24
    • 1970-01-01
    • 2015-09-26
    • 2018-04-14
    • 1970-01-01
    • 2021-10-05
    • 2017-01-31
    相关资源
    最近更新 更多