【问题标题】:Django M2M Through extra fields with multiple modelsDjango M2M 通过具有多个模型的额外字段
【发布时间】:2015-06-03 22:02:36
【问题描述】:

我正在尝试找出设置以下 django 模型的最佳方法(出于安全原因进行了通用化)。

ThingA:
    User(M2M through "UserRelation")

ThingB:
    User(M2M through "UserRelation")

ThingC:
    User(M2M through "UserRelation")

User:
    Login_name

UserRelation:
    User (foreginkey)
    Thing (foreignkey) #is this generic to any of the above "things"
    Privilege

我了解在两个不同模型之间使用“通过”,但我不确定如何将其应用于多个模型。我会为我的 UserRelation 模型中的每个“事物”模型定义一个外键吗?

【问题讨论】:

  • 事物模型有何不同?它们是完全不同的,还是有共同的属性等?
  • 它们完全不同。所以 thingA 可能像 School,thingB 可能像 Houses
  • 我想我明白你的意思了。我可以为每个有用户 m2m 字段的东西做一个基本模型。那么关系字段可以引用基本模型吗?
  • 为每种类型设置一个单独的列将使其成为一个稀疏表。我只会有单独的关系表。我要研究的另一件事是看看GenericForiegnKey 关系在这种情况下是否合适(同样不完全相信,因为在这种情况下你无法利用 M2M 的力量)。
  • 这是我最初的想法,但是使用基本引用模型会添加不必要的查找来识别类型等。

标签: python django relationship m2m


【解决方案1】:

您似乎正在尝试建立一个通用的多对多关系。有一个专用的 django 应用程序可用于此目的:django-gm2m

以下是如何在您的通用案例中使用它:

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey

from gm2m import GM2MField


class ThingA(models.Model):
    pass

class ThingB(models.Model):
    pass

class ThingC(models.Model):
    pass

class User(models.Model):
     login_name = models.CharField(max_length=255)
     things = GM2MField(through='UserRelation')

class UserRelation(models.Model):
     user = models.ForeignKey(User)
     thing = GenericForeignKey(ct_field='thing_ct', fk_field='thing_fk')
     thing_ct = models.ForeignKey(ContentType)
     thing_fk = models.CharField(max_length=255)

     privilege = models.CharField(max_length=1)

您现在可以访问给定用户的所有things 和给定“事物”的所有User 实例,以及每个UserRelation 实例的权限属性。

这还将为您提供一些您可能需要的好处(反向关系、预取等)。 GM2MField 的行为基本上与 django ManyToManyField 完全一样。

免责声明:我是django-gm2m的作者

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2016-12-17
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
相关资源
最近更新 更多