Python Django M2M通过多个模型的额外字段

Python Django M2M通过多个模型的额外字段,python,django,relationship,m2m,Python,Django,Relationship,M2m,我试图找出建立以下django模型的最佳方法(出于安全原因进行了泛型) 我理解在两个不同的模型之间使用“through”,但我不确定如何将其应用于多个模型。我会为UserRelation模型中的每个“Thing”模型定义一个foreignkey吗 看起来您正试图建立一个通用的多对多关系。有一个专用的django应用程序可用于此目的: 以下是如何在一般情况下使用它: from django.db import models from django.contrib.contenttypes.fiel

我试图找出建立以下django模型的最佳方法(出于安全原因进行了泛型)


我理解在两个不同的模型之间使用“through”,但我不确定如何将其应用于多个模型。我会为UserRelation模型中的每个“Thing”模型定义一个foreignkey吗

看起来您正试图建立一个通用的多对多关系。有一个专用的django应用程序可用于此目的:

以下是如何在一般情况下使用它:

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)
现在,您可以访问给定用户的所有
事物
,以及给定“事物”的所有
用户
实例,以及每个
用户关系
实例的特权属性

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


免责声明:我是《thing models有何不同》一书的作者?它们是完全不同的,还是有共同的属性,等等?它们是完全不同的。所以A可能像学校,B可能像房子我想我明白你的意思了。我可以为每个有用户m2m字段的东西做一些类似于基本模型的事情吗。那么关系字段就可以引用基本模型了?为每种类型提供单独的列将使其成为稀疏表。我只需要单独的关系表。我要研究的另一件事是看
GenericForiegnKey
关系在这种情况下是否合适(同样不完全令人信服,因为在这种情况下,您无法利用M2M的功能)。这是我最初的想法,但使用基础引用模型会添加不必要的查找来识别类型,等等。那么,当你有“通过”关系时,你如何反向访问它呢?我把我的评论变成了一个问题:
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)