2015-03-30 83 views
0

我试图找出设置以下django模型(通用为安全原因)的最佳方法。Django M2M通过与多个模型的额外字段

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 Model中为每个“Thing”模型定义一个外键?

+0

如何做事情的型号而异的作者?它们是完全不同的,还是具有共同的特性等? – karthikr 2015-03-30 19:33:51

+0

他们完全不同。所以thingA可能像学校,thingB可能像房屋 – 2015-03-30 19:40:45

+0

我想我看你在哪里。我可以为每个拥有用户m2m字段的东西做一些基本模型。那么关系字段可以引用基本模型呢? – 2015-03-30 19:47:21

回答

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给定用户和给定'thing'的所有User实例,以及每个UserRelation实例的特权属性。

这还会为您提供一些您可能需要的优势(反向关系,预取等)。 A GM2MField的行为基本上与django ManyToManyField完全相同。

免责声明:我的django-gm2m

相关问题