4

私はこれらのモデルを持っています:

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 でこのフィルターを作成する方法がわかりません。

4

1 に答える 1

0

ドキュメントをご覧になりましたか?情報は私にとってかなり役立つようです。これは、私の(ほとんどの)経験で見た方法では、仕事を完了するために数回の呼び出しが必要になる可能性があるため、役立つ場合があります。それがうまくいくことを願っています

https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#reverse-generic-relations

于 2014-06-24T18:00:01.760 に答える