Python Django M2M通过多个模型的额外字段
我试图找出建立以下django模型的最佳方法(出于安全原因进行了泛型)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
我理解在两个不同的模型之间使用“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
的行为基本上与djangoManyToManyField
完全相同
免责声明:我是《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)