2010-04-12 7 views
1

Cette question est liée à my other question mais j'ai un peu changé la logique.Django: Paramètres de filtre complexes ou ...?

J'ai modèles comme ceci:

from django.contrib.auth.models import Group 

class Category(models.Model): 
    (...) 
    editors = ForeignKey(Group) 

class Entry(models.Model): 
    (...) 
    category = ForeignKey(Category) 

Maintenant, disons que les journaux de l'utilisateur dans le panneau d'administration et veut changer une entrée. Comment puis-je limiter la liste des entrées à ceux, il a le droit de modifier? Je veux dire: Comment puis-je lister uniquement les Entrées affectées à une Catégorie qui, dans son champ "éditeurs", a un des groupes auxquels appartient l'Utilisateur?

Que faire si l'utilisateur appartient à plusieurs groupes? J'ai encore besoin de montrer toutes les entrées pertinentes.

J'ai essayé d'expérimenter avec les méthodes changelist_view() et queryset() mais ce problème est un peu trop complexe pour moi.

Je me demande également si granular-permissions pourrait m'aider avec la tâche, mais pour l'instant je n'ai aucune idée.

Je suis arrivé seulement avec ceci: D'abord, j'ai la liste de tous les groupes auxquels appartient l'utilisateur. Ensuite, pour chaque groupe, je reçois toutes les catégories connectées, puis pour chaque catégorie, j'obtiens toutes les entrées qui appartiennent à ces catégories. Malheureusement, je n'ai aucune idée de comment assembler tout ensemble en tant que paramètres filter() pour produire un simple QuerySet simple.

EDIT:

J'ai essayé d'utiliser MultiQuerySet comme ceci:

class EntryAdmin(admin.ModelAdmin): 

    (...) 

    def queryset(self, request): 
     qs = super(EntryAdmin, self).queryset(request) 
     if not request.user.is_superuser: 
      groups = request.user.groups.all() 
      list = [] 
      for group in groups: 
       categories = Category.objects.filter(editors=group) 
       for category in categories: 
        results = qs.filter(category=category) 
        list.append(results) 
      qs = MultiQuerySet(*list) 
     return qs 

mais je reçois une erreur de base de données dans la vue admin (pas une erreur Django, page d'administration normale est affiché, mais au lieu d'un liste il y a "erreur de base de données")

Répondre

3

Vous pouvez essayer d'utiliser l'opérateur __in:

qs = Category.objects.filter(editors__in=request.user.groups.all()) 
+0

Ohmigod, ça a fait l'affaire! J'ai utilisé ceci: qs = qs.filter (category__in = Category.objects.filter (editors__in = request.user.groups.all())) MERCI! – minder