2015-03-30 4 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?

+0

Как делать то, что модели отличаются? они совершенно разные или имеют общие свойства и т. д.? – karthikr

+0

они совершенно разные. Так что вещьА может быть похожа на школу, и вещьБ может быть похожа на дома –

+0

Думаю, я вижу, к чему вы клоните. Могу ли я сделать что-то вроде базовой модели для каждой вещи, которая имеет поле пользователя m2m. то поле отношения могло бы ссылаться на базовую модель вместо этого? –

ответ

1

Похоже, вы пытаетесь установить общие отношения «многие ко многим». Существует специальная Джанго приложение, которое вы можете быть использованы для этой цели: 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.

Это дополнительно предоставит вам несколько преимуществ (обратные отношения, предварительная выборка и т. Д.), Которые могут вам понадобиться. A GM2MField в основном ведет себя точно так же, как django ManyToManyField.

Отказ от ответственности: я являюсь автором django-gm2m