1

以下は私のモデルです

class Group(Log_Active_Owned_Model_Mixin):

    group_name = SafeCharField(max_length = 100, null=False, blank=False, sanitize_cb=safe_name_sanitizer)
    group_creator = ForeignKey(to=PSS_User, null=False, related_name="group_creator")
    members = ManyToManyField(to=PSS_User, through="GroupMemberShip", related_name="group_member")

    class Meta:
        ordering = ("Meta", )

    ## other methods also exists in this class.

class GroupMemberShip(Log_Active_Owned_Model_Mixin, ResolvableModelMixin):

    MEMBER_NONE     = 1
    MEMBER_ADMIN    = 2
    MEMBER_STANDARD = 4


    VALID_MEMBERSHIPS = (
        (MEMBER_ADMIN,      "Admin"     ),
        (MEMBER_STANDARD,   "Standard"  ),
        (MEMBER_NONE,       "None"      )
    )

    member  = ForeignKey(to=PSS_User, null=False, related_name="groups")
    group   = ForeignKey(to=Group, null=False, related_name="members")
    membership_type     = SmallIntegerField(editable=False, null=False, blank=False, choices=VALID_MEMBERSHIPS)
    membership_request  = ForeignKey(to=GroupMemberShipRequest, null=True, blank=True)  # null True for group creator

    class Meta:
        ordering = ("date_created")
        unique_together = ("member", "group")

    ## other methods also exists in this class.

class GroupMemberShipRequest(Log_Active_Owned_Model_Mixin):

    GRP_MEMBERSHIP_REQ_STATUS_ACCEPTED  = 1
    GRP_MEMBERSHIP_REQ_STATUS_REJECTED  = 2
    GRP_MEMBERSHIP_REQ_STATUS_PENDING   = 4

    VALID_REQUEST_STATUSES = (
        (GRP_MEMBERSHIP_REQ_STATUS_ACCEPTED,    "Accepted"),
        (GRP_MEMBERSHIP_REQ_STATUS_REJECTED,    "Rejected"),
        (GRP_MEMBERSHIP_REQ_STATUS_PENDING,     "Pending")
    )

    #   TODO :-
    #   Add a field in request-type. There are two types of requests :-
    #   User can request admin to include him in the request.
    #   Admin can request other user, to become part of given group.

    GRP_REQUEST_ACTIVE  = 1
    GRP_REQUEST_PASSIVE = 2

    VALID_GRP_REQUESTS = (
        (GRP_REQUEST_ACTIVE,    "Active"),
        (GRP_REQUEST_PASSIVE,   "Passive")
    )

    request_initiator = ForeignKey(to=PSS_User, null=False, blank=False)
    request_acceptor_rejector = ForeignKey(to=PSS_User, null=True, blank=False)
    request_status  = SmallIntegerField(null=False, editable=False, choices=VALID_REQUEST_STATUSES, default=GRP_MEMBERSHIP_REQ_STATUS_PENDING)
    target_group = ForeignKey(to=Group, null=False, blank=False, related_name="members")
    request_type = SmallIntegerField(null=False, editable=False, default=GRP_REQUEST_ACTIVE, choices=VALID_GRP_REQUESTS)

以下は、このグループ モデルで可能なさまざまなタイプの操作です。

  • グループを作成
  • グループの更新
    1. グループの詳細を更新します。
    2. グループ メンバーの追加/削除
    3. 部外者に招待を送る
    4. 管理者にする/管理者を削除します。
      • グループを削除

作成/削除操作については明らかですが、更新できるものが複数あるため、更新操作については混乱しています。現在、上記のすべてのアクティビティを実行する Group クラスにヘルパー メソッドを追加しました。

私の質問は、DRF(Django Rest Framework) ModelViewSets とどのように統合できますか。update() メソッドは 1 つしかないため、上記の更新シナリオの 1 つだけを処理できます。他の更新シナリオをどのように処理できますか?(考えられる解決策の1つは、リクエストで操作タイプフラグを使用し、 update() メソッドでそれをチェックして、どのモデルメソッドを呼び出すかを決定することだと思いますが、それは少し単純な解決策です。 Django Rest Framework でこれを行う方法は?)

前もって感謝します。

4

1 に答える 1