0

このスニペットhttps://gist.github.com/735861を使用して、モデルの pk を暗号化しています。

単一のオブジェクトを取得する通常の方法を使用すると、MyModel.object.get(encrypted_pk=url_pk)問題なく動作します。しかし、ここget_object_or_noneから関数を使用すると、次のエラーがスローされますFieldError. Cannot resolve keyword 'encrypted_pk' into field.

問題は、マネージャーの実装方法にあると思われます。それを修正する方法はありますか?

4

1 に答える 1

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インスタンスを返すためです。

于 2013-01-17T11:40:06.690 に答える