2

バックグラウンド:

モデル ユーザーの外部キー && 関連する名前、グループ、およびアクセス許可に基づいて、モデル クエリセットの結果をフィルター処理する方法を知りたいです。これが私がやりたいことの簡単な例です:

  • すべての従業員が使用できる社用車があるとします (読み取り専用状態)。
  • また、どの従業員も自分の車を使用することを選択できるとしましょう (所有者のみが変更可能)

以下にリストされているのは、解決策への最初の刺し傷を伴う上記のシナリオです。

from django.contrib.auth.models import User
from django.db.models import Q

user1 = User.objects.create_user("Billy", 'bbob@gmail.com', 'pw');
user2 = User.objects.create_user("Johnny Boy", 'jbo@gmail.com', 'pw2');
user1.groups.add('employee')
user2.groups.add('employee')

class Car(models.Model):
     name = models.CharField(max_length=200)
     color = models.CharField(max_length=50)
     carOwner = models.OneToOneField('User')

qObj = Q(carOwner__user_username = user1.username) 

for empGroup in user1.groups:
    qObj |= Q(carOwner__groups__icontains = empGroup)

transOpts= Car.objects.filter(qObj) #All Transportation Options for given user

質問:

解決策の最初の試みを提供しましたが、そのような状況を処理するための「正しい」方法を知りたいです。これ以上苦労することなく、ここに質問があります:

Q: ユーザーの名前、グループ、権限の組み合わせに基づいてモデルをフィルタリングするにはどうすればよいですか?

4

1 に答える 1

1

私の理解が正しければ、ユーザーが所有するか、同じグループのユーザーが所有するすべての車が必要です。あなたのモデルでは、おそらくこれを行うことができます(テストされていません):

Car.objects.filter(Q(carOwner=user) | Q(carOwner__groups__in=user.groups))

補足:

このアプローチはおそらく、メールとグループ名の文字列比較を使用する代わりに、ユーザーとユーザーのグループ ID を使用する、より優れたクエリを生成します。

car_ownerの代わりに使用carOwnerします。Python の属性名は、すべて小文字で名前を付け、アンダースコアで区切ることが望ましいです

于 2013-11-10T20:38:30.953 に答える