【问题标题】:Django Many Users to One model. A Model about the UserDjango 多用户合一模型。关于用户的模型
【发布时间】:2019-11-03 12:02:36
【问题描述】:

我试图弄清楚有多少用户可以与模型的一个实例相关联。

我有一个体育俱乐部项目。有许多用户(管理员和员工)只有一个俱乐部。我似乎无法与 User 模型形成多对一的关系。 我想主要按俱乐部过滤。 假设有 3 个俱乐部使用该项目,每个俱乐部都希望被俱乐部而不是用户分开。

以下是我的模型的简化版本。 我还尝试将 ForeignKey 添加到俱乐部并走另一条路。

Class Club(models.model):
    name = models.CharField(max_length=40, null=True)


Class User(AbstractBaseUser):
    name = models.CharField(max_length=40, null=True)
    club = models.ForeignKey(Club, on_delete=models.CASCADE)

【问题讨论】:

  • 你有什么问题?顺便说一句,我认为您不想允许 Clubs 和 Users 没有名字。
  • 我试图让每个用户都与俱乐部建立多对一的关系。假设有 3 个本地俱乐部使用该软件。我希望俱乐部作为主要模型,并且为该俱乐部工作的人只与他们的俱乐部相关联。类似于每支球队只与一个俱乐部相关联。
  • 你的问题是什么?我不是想成为一个混蛋,但除非您提供问题,否则提供答案并不容易。

标签: python django django-models foreign-keys


【解决方案1】:

您正在适当地定义您的模型。当您创建 ForeignKey 时,与之关联的模型的每个实例(这里是您的 Club 模型)都可以通过 Manager 对象访问与其关联的实例。您可以在 ForeignKey 字段定义中定义“related_name”参数,以便您的俱乐部对象可以通过自定义名称(而不是默认名称)访问与其关联的用户:

Class Club(models.model):
    name = models.CharField(max_length=40, null=True)

Class User(AbstractBaseUser):
    name = models.CharField(max_length=40, null=True)
    club = models.ForeignKey(Club, related_name="members", on_delete=models.CASCADE)

然后,您可以使用 club.members.all 访问相关用户,假设“club”是传递给模板的俱乐部上下文对象的名称,“members”是 User 模型与 Club 的 ForeignKey 关系的 related_name。举个简单的例子,如果您想列出俱乐部的成员,您可以执行以下操作:

{% for member in club.members.all %}
    <p>{{member.name}} is a member</p>
{% endfor %}

查看此链接以了解有关 ForeignKey 关系的更多信息:https://docs.djangoproject.com/en/2.2/topics/db/queries/#following-relationships-backward

【讨论】:

    【解决方案2】:

    由于只有一个俱乐部,但有不同的用户,我相信你的模型应该保持这样,但在用户模型上,你可以为俱乐部中的不同用户分配不同的角色

    Class User(AbstractBaseUser):
        name = models.CharField(max_length=40, null=True)
        club = models.ForeignKey(Club, on_delete=models.CASCADE)
        is_staff = models.BooleanField(default=False)
        is_admin = models.BooleanField(default=False)
    

    【讨论】:

      猜你喜欢
      • 2019-06-07
      • 2018-09-29
      • 1970-01-01
      • 2013-05-28
      • 2018-07-30
      • 2013-12-23
      • 2012-12-22
      • 2020-02-12
      • 1970-01-01
      相关资源
      最近更新 更多