2

ガーディアンを独自の User モデルで使用しようとしています。はい、わかっています。Guardian が別の User モデルで動作するという保証はありません :-)。しかし、これを理解しようとして、これを実行できるかどうかを確認するための助けをいただければ幸いです。

私のユーザーモデルは次のように定義されています:

class Member(AbstractBaseUser, PermissionsMixin):
    ...

assign_perm('tab.view_tab', mem, ttt) を呼び出すとエラーが発生します。

IntegrityError: insert or update on table "guardian_userobjectpermission" violates foreign key constraint "guardian_userobjectpermission_user_id_fkey"
DETAIL:  Key (user_id)=(67) is not present in table "member_member".

「mem」メンバー (つまりユーザー) の ID は 67 なので、正しいです。member_member は正しいようです。

トレースバックの上部は次のとおりです。

   In [14]: assign_perm('tab.view_tab', mem, ttt)                                                                                                                             
    ---------------------------------------------------------------------------
    IntegrityError                            Traceback (most recent call last) 
    <ipython-input-14-fbd245913aef> in <module>()
    ----> 1 assign_perm('tab.view_tab', mem, ttt)

<dir>/env/local/lib/python2.7/site-packages/guardian/shortcuts.pyc in assign_perm(perm, user_or_group, obj)
     89     if user:
     90         model = get_user_obj_perms_model(obj)    
---> 91         return model.objects.assign_perm(perm, user, obj)
     92     if group:
     93         model = get_group_obj_perms_model(obj)

  <dir>/env/local/lib/python2.7/site-packages/guardian/managers.pyc in assign_perm(self, perm, user, obj)
      39         else:
      40             kwargs['content_object'] = obj
  ---> 41         obj_perm, created = self.get_or_create(**kwargs)
     42         return obj_perm
     43

<dir>/env/local/lib/python2.7/site-packages/django/db/models/manager.pyc in manager_method(self, *args, **kwargs)
     90         def create_method(name, method):
     91             def manager_method(self, *args, **kwargs):
---> 92                 return getattr(self.get_queryset(), name)(*args, **kwargs)
     93             manager_method.__name__ = method.__name__
     94             manager_method.__doc__ = method.__doc__
....

私がやったときmem = Member.objects.get(pk=2)assign_perm('tab.view_tab', mem, ttt)それはエラーなしでうまくいきました。私がそうするmem = Member.objects.get(pk=3)と、assign_perm('tab.view_tab', mem, ttt)上記のように失敗しました。ということで、少し希望が持てそうです。

django-guardian を他のユーザー モデルと連携させている人もいると思いますので、これを機能させるために自分で何を変更できるかを確認したいと思います。しかし、確かに、私は立ち往生しています。ありがとう!

4

0 に答える 0