动态字段和get_object_or_none

时间:2013-01-15 16:49:31

标签: django django-models

我正在使用此代码段https://gist.github.com/735861来加密我的模型的pk。

如果我使用获取单个对象MyModel.object.get(encrypted_pk=url_pk)的常规方法,它可以完美地运行。但是,如果我使用here中的get_object_or_none函数,则会引发以下错误FieldError. Cannot resolve keyword 'encrypted_pk' into field.

我怀疑问题是经理的实施方式。有什么办法解决吗?

1 个答案:

答案 0 :(得分:0)

我认为可以通过这种方式解决:

class EncryptedPKQuerySet(models.query.QuerySet):
    def filter(self, *args, **kwargs):
        encrypted_pk = kwargs.pop('encrypted_pk', None)
        if encrypted_pk:
            # If found, decrypt encrypted_pk argument and set pk argument to the appropriate value
            kwargs['pk'] = struct.unpack('<Q', self.model.encryption_obj.decrypt(
                struct.pack('<Q', base36decode(encrypted_pk))
            ))[0]
        print kwargs
        return super(EncryptedPKQuerySet, self).filter(*args, **kwargs)

class EncryptedPKModelManager(models.Manager):
    def get_query_set(self):
        return EncryptedPKQuerySet(self.model, using=self._db)

因为在get_object_or_None中,QuerySet被构建为model.manager.all().get(...)all()返回QuerySet实例。