2015-03-30 84 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

相關問題