Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建一个django管理器,该管理器基于数据库项进行动态筛选_Django_Django Models_Django Managers - Fatal编程技术网

创建一个django管理器,该管理器基于数据库项进行动态筛选

创建一个django管理器,该管理器基于数据库项进行动态筛选,django,django-models,django-managers,Django,Django Models,Django Managers,标题有点粗糙,让我详细解释一下: 我有一个名为Identity的表,它是这样一个简单的表: class Identity(models.model): identity_name = models.CharField(max_length=20, db_index=True) # name of the ID service_name = models.CharField(max_length=50) 数据库中的一个示例行是带有identity\u name='Faceboo

标题有点粗糙,让我详细解释一下:

我有一个名为
Identity
的表,它是这样一个简单的表:

class Identity(models.model):

    identity_name = models.CharField(max_length=20, db_index=True) # name of the ID
    service_name = models.CharField(max_length=50)
数据库中的一个示例行是带有
identity\u name='FacebookID'
的Facebook标识和
服务\u name='Facebook'

现在,要将其链接到用户,我有下表:

class UserIdentity(models.Model):

    user = models.ForeignKey('django.contrib.auth.models.User', db_index=True)
    identity_type = models.ForeignKey('Identity', db_index=True)
    value = models.CharField(maxlength=50) # the ID value

    objects = models.Manager()
    identities = IdentitesManager()
假设
Bob
django.contrib.auth.models.User
的一个实例。我想通过
Bob.identies.Facebook
访问它的Facebook身份,其中
Facebook
是在
identiesmanager
中动态生成的

现在您了解了上下文,问题是:如何从数据库中检索标识,以便在
标识管理器中使用它们


感谢阅读。

如果我理解了您的问题,您可以在
管理器中获得该型号的
查询集
,如下所示:

class IdentitiesManager(models.Manager):
    def  some_func(self):
        qs = super(IdentitiesManager, self).get_query_set()

最后,我找到了如何做到这一点。我创建了一个继承自
dict
的类,并使其基于dict中包含的数据创建其属性(使用
setattr
)。类代码为:

class IdentityDictionary(dict):
    """ 
        Create a custom dict with the identities of a user.
        Identities are accessible via attributes or as normal dict's key/value.

    """

    def __init__(self, user, key='service_name'):

        identities = UserIdentity.objects.filter(user=user)
        dict_identities = dict([ (getattr(user_id.identity, key).replace(' ', '').lower(), user_id.identity) for user_id in identities ])

        super(IdentityDictionary, self).__init__(dict_identities)

        for id_name, id_value in dict_identities.items():
            setattr(self, id_name, id_value)
然后我制作了一个mixin添加到用户类:

class IdentitiesMixin(object):
""" 
    Mixin added to the user to retrieve identities 

"""
_identities_dict = {}
_is_identities_initialized = False

@property
def identities(self):
    if not self._is_identities_initialized :
        self._identities_dict = IdentityDictionary(self)
        self._is_identities_initialized = True

    return self._identities_dict
还有一点:自定义dict不用于可重用性:如果
dict
是(希望它不是类用例的问题),则不会更新属性。

super(identiesmanager,self)。get_query_set()
??