私はこれらのモデルを持っています:
class EventEntry(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
start_date = models.DateTimeField(...)
end_date = models.DateTimeField(...)
field = models.CharField(max_length=64)
class ObjectPerm(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
public = models.BooleanField(...)
users = models.ManyToManyField(User...)
groups = models.ManyToManyField(Group...)
class Meeting(models.Model):
scheduled_time = generic.GenericRelation(EventEntry)
room = models.CharField(max_length=8)
permissions = GenericRelation(ObjectPerm)
class Milestone(models.Model):
due_date = generic.GenericRelation(EventEntry)
title = models.CharField(max_length=128)
permissions = GenericRelation(ObjectPerm)
EventEntry クラスは、会議やマイルストーンなどのオブジェクトにスケジュール情報を添付するために使用されます。
ObjectPerm クラスは、保護が必要なすべてのモデルにオブジェクト レベルのアクセス許可を提供します。
Meeting のインスタンスを作成するときに、スケジュール情報に EventEntry インスタンスを割り当てます。また、ObjectPerm インスタンスを割り当てて、会議オブジェクトにアクセスできるユーザーを指定します。
Meeting や Milestone などのモデルが他にもあります。
ここで、EventEntry インスタンスを取得しますが、ObjectPerm モデルに基づいて、ユーザーがアクセス権を持つ関連オブジェクトのインスタンスのみを取得します。
たとえば、public == True であるすべての EventEntry インスタンス、またはユーザーが EventEntry フィールド「users」にある場合などです。このようにして、カレンダーに表示するすべてのイベントを引き出すことができますが、会議やマイルストーンなどをフィルター処理する必要はありません。ただし、Django の ORM を使用して Python でこのフィルターを作成する方法がわかりません。