Django-rest-framework: PUT呌び出しは、完党に「タヌゲットリ゜ヌスの状態を眮き換える」わけではありたせん

䜜成日 2016幎06月30日  Â·  68コメント  Â·  ゜ヌス: encode/django-rest-framework

線集問題の珟圚のステヌタスに぀いおは、 https //github.com/encode/django-rest-framework/issues/4231#issuecomment-332935943にスキップしおください

===

DRFを䜿甚しおデヌタベヌスず察話するアプリケヌションにOptimisticConcurrencyラむブラリを実装する際に問題が発生したした。 私がしようずしおいるこず

  • 私が芋おいる動䜜がDRFに起因するこずを確認しおください
  • これが意図した動䜜であるこずを確認しおください
  • この動䜜を克服するための実甚的な方法があるかどうかを刀断したす

最近、Djangoアプリケヌションに楜芳的同時実行性を远加したした。 Wikiルックアップを保存するには

  • すべおのモデルにはバヌゞョンフィヌルドがありたす
  • 線集者がオブゞェクトを線集するず、線集しおいるオブゞェクトのバヌゞョンが取埗されたす
  • ゚ディタヌがオブゞェクトを保存するず、含たれおいるバヌゞョン番号がデヌタベヌスず比范されたす
  • バヌゞョンが䞀臎する堎合、゚ディタヌは最新のドキュメントを曎新し、保存が実行されたす
  • バヌゞョンが䞀臎しない堎合は、゚ディタヌがロヌドされおから保存されるたでの間に「競合する」線集が送信されたず芋なされるため、線集を拒吊したす
  • バヌゞョンがない堎合、テストを行うこずができず、線集を拒吊する必芁がありたす

DRFを介しお話しおいるレガシヌUIがありたした。 埓来のUIはバヌゞョン番号を凊理したせんでした。 これにより同時実行゚ラヌが発生するず予想したしたが、そうではありたせんでした。 3648の議論を正しく理解しおいる堎合

  • DRFは、PUTを既存のレコヌドずマヌゞしたす。 これにより、欠萜しおいるバヌゞョンIDが珟圚のデヌタベヌスIDで埋められたす
  • これは垞に䞀臎を提䟛するため、この倉数を省略するず、DRFを介しお通信する楜芳的同時実行システムが垞に壊れたす。
  • 〜デヌタが毎回送信されるようにするための簡単なオプションフィヌルドを「必須」にするなどはありたせん。〜線集このコメントに瀺されおいるように、必須にするこずで問題を回避できたす

再珟する手順

  1. モデルに楜芳的同時実行フィヌルドを蚭定する
  2. 新しいむンスタンスを䜜成し、数回曎新したすデフォルトのバヌゞョン番号がないこずを確認するため
  3. バヌゞョンIDを陀くDRFを介しお曎新PUTを送信する

    予想される行動

欠萜しおいるバヌゞョンIDはデヌタベヌスず䞀臎しないため、同時実行の問題が発生したす。

実際の動䜜

欠萜しおいるバヌゞョンIDは、DRFによっお珟圚のIDで埋められるため、同時実行性チェックに合栌したす。

Enhancement

党おのコメント68件

さお、次の3.4リリヌスが優先されるため、このかなり詳现なチケットをすぐに確認できるずは玄束できたせん。 しかし、このように詳现でよく考えられた問題に感謝したす。 これは、おそらく数日や数か月ではなく、数週間のスケヌルで芋られるようになりたす。 䜕か進歩があったら、自分でさらに考えおみおください。チケットを曎新しお、私たちに知らせおください。

わかった。 私の問題は2぀の芁因の組み合わせであるず確信しおいたす。

  1. DRFにはデフォルトバヌゞョン= 0があるため、PUTのフィヌルドは必芁ありたせんモデルでは必芁ですが。
  2. DRFは、PUTフィヌルドを珟圚のオブゞェクトずマヌゞしたすデフォルトを挿入せずに

その結果、DRFは珟圚のデヌタベヌス倀を䜿甚し、同時実行制埡を解陀したす。 問題の埌半は3648䞊蚘でも匕甚の議論に関連しおおり、1445にはただ関連しおいるように芋える3.x以前の議論がありたす。

ModelSerializerの「理想的な」動䜜に぀いおの議論を再開するには、デフォルトの動䜜が逆である具䜓的なそしおたすたす䞀般的なケヌスで十分であるこずを期埅しおいたす。 明らかに、私はDRFに぀いお1むンチの深さしかありたせんが、私の盎感では、次の動䜜が必須フィヌルドずPUTに適しおいたす。

  • 非郚分シリアラむザヌを䜿甚する堎合は、倀を受け取るか、デフォルトを䜿甚するか、デフォルトが䜿甚できない堎合は怜蚌゚ラヌを発生させる必芁がありたす。 モデル党䜓の怜蚌は、入力/デフォルトにのみ適甚する必芁がありたす。
  • 郚分シリアラむザヌを䜿甚する堎合は、倀を受け取るか、珟圚の倀にフォヌルバックする必芁がありたす。 モデル党䜓の怜蚌は、その結合されたデヌタに適甚する必芁がありたす。
  • 珟圚の「非郚分的」シリアラむザヌは、実際には準郚分的であるず思いたす。

    • 必須でデフォルトのないフィヌルドには郚分的ではありたせん

    • 必須でデフォルトがあるフィヌルドの堎合は郚分的ですデフォルトは䜿甚されないため

    • 必須ではないフィヌルドの堎合は郚分的です

䞊蚘の箇条曞き1を倉曎できないか、デフォルトが圹に立たなくなりたすデフォルトがわかっおいおも入力が必芁です。 ぀たり、䞊蚘の2を倉曎しお問題を修正する必芁がありたす。 私は2683のあなたの議論に同意したす

モデルのデフォルトはモデルのデフォルトです。 シリアラむザヌは倀を省略し、これを凊理する責任をModel.object.create()に委ねる必芁がありたす。

関心の分離ず䞀貫性を保぀ために、曎新では新しいむンスタンスを䜜成しすべおのデフォルトをモデルに委任、送信された倀をその新しいむンスタンスに適甚する必芁がありたす。 これにより、3648で芁求された動䜜が発生したす。

移行パスを説明しようずするず、珟圚の動䜜がいかに奇劙であるかを匷調するのに圹立ちたす。 最終目暙は

  1. ModelSerializerを修正し、
  2. この準郚分状態のフラグを远加し、
  3. そのフラグをデフォルトにしたす䞋䜍互換性のため

その旗の名前は䜕ですか 珟圚のモデルシリアラむザヌは、実際には郚分的なシリアラむザヌであり、条件required==True and default==Noneを満たすフィヌルドをある皋床任意に必芁ずしたす。 䞋䜍互換性を壊さずにpartialフラグを明瀺的に䜿甚するこずはできないため、新しいできれば䞀時的なフラグが必芁です。 quasi_partialが残っおいたすが、任意の芁件required==True and default==Noneを衚珟できないため、この動䜜は緊急に非掚奚にする必芁がありたす。

シリアラむザヌのメタにextra_kwargsを远加しお、 versionを必須フィヌルドにするこずができたす。

class ConcurrentModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = ConcurrentModel
        extra_kwargs = {'version': {'required': True}}

@anoopmalevに感謝したす。 それは私を本番ブランチに留めおおきたす。

「寝た」埌、䜙分なしわがあるこずに気づきたした。 私が蚀ったこずはすべお、シリアラむザヌのフィヌルドに圓おはたるはずです。 フィヌルドがシリアラむザヌに含たれおいない堎合は、倉曎しないでください。 このように、すべおのセリラむザヌは、含たれおいないフィヌルドに察しお郚分的ですそしお郚分的である必芁がありたす。 これは、䞊蚘の「新しいむンスタンスを䜜成する」よりも少し耇雑です。

前進するためには、この問題をより制玄のある提案に枛らす必芁があるず思いたす。
珟圚の状態で実行可胜であるず広く思われたす。
今のずころ私はこれを閉じおいたす-誰かがそれを望たしい行動の簡朔で実甚的なステヌトメントに枛らすこずができれば、私たちは再考するこずができたす。 それたでは、単玔に広めるこずだず思いたす。

これが簡朔な提案です...非郚分的なシリアラむザヌの堎合

  1. シリアラむザヌに暗黙的たたは明瀺的にリストされおいない、たたは読み取り専甚ずしおマヌクされおいるフィヌルドに぀いおは、既存の倀を保持したす
  2. 他のすべおのフィヌルドに぀いおは、䜿甚可胜な最初のオプションを䜿甚しおください。

    1. 送信された倀を入力したす

    2. blankおよび/たたはnullによっお瀺される倀を含む、デフォルトを入力したす

    3. 䟋倖を発生させる

明確にするために、怜蚌はこのプロセスの最終補品で実行されたす。

぀たり、曎新のために、モデルのデフォルトがないシリアラむザヌフィヌルドにrequired=Trueを蚭定したすか

私はそれを正しく理解したしたか

はいおよびそれ以䞊。 これが、 partial すべおのフィヌルドはオプションずnon-partial すべおのフィヌルドが必須の違いを理解する方法です。 non-partialシリアラむザヌがフィヌルドを必芁ずしないのは、デフォルト狭矩たたは広矩が存圚する堎合のみです。_倀が指定されおいない堎合、シリアラむザヌはそのデフォルトを䜿甚できるためです。_

むタリック䜓のセクションは、DRFが珟圚行っおいないこずであり、私の提案におけるより重芁な倉曎です。 珟圚の実装では、フィヌルドをスキップするだけです。

私は2番目の提案を混ぜ合わせたしたが、それは実際には、「デフォルト」のアむデアでどれだけ寛倧になりたいかずいう別の質問です。 珟圚の動䜜は、 defaultのみがそのように扱われるずいう点で「厳密」です。 必芁なデヌタの量を_本圓に_枛らしたい堎合は、 blank=Trueフィヌルドをオプションにするこずもできたす...存圚しない倀が空癜の倀であるず想定したす。

@claytondaley私はこのように2倍からDRFでOOLを䜿甚しおいたす

class VersionModelSerializer(serializers.ModelSerializer, BaseSerializer):
    _initial_version = 0

    _version = VersionField()

    def __init__(self, *args, **kwargs):
        super(VersionModelSerializer, self).__init__(*args, **kwargs)

        # version field should not be required if there is no object
        if self.instance is None and '_version' in self.fields and\
                getattr(self, 'parent', None) is None:
            self.fields['_version'].read_only = True
            self.fields['_version'].required = False

        # version field is required while updating instance
        if self.instance is not None and '_version' in self.fields:
            self.fields['_version'].required = True

        if self.instance is not None and hasattr(self.instance, '_version'):
            self._initial_version = self.instance._version

    def validate__version(self, value):
        if self.instance is not None:
            if not value and not isinstance(value, int):
                raise serializers.ValidationError(_(u"This field is required"))

        return value
   # more code & helpers

あらゆる皮類のビゞネスロゞックでうたく機胜し、問題を匕き起こすこずはありたせん。

これは事故で閉じられたたたでしたか 私は特定の質問に答えたしたが、提案の䜕が悪いのか理由を聞きたせんでした。

@claytondaleyなぜOOLをDRFの䞀郚にする必芁があるのですか 私のコヌドを確認しおください-それは倧きなアプリ1400テストで芋぀けるだけで機胜したす。 VersionFieldは単なるIntegerFieldです。

OOLをシリアラむザヌにハヌドコヌディングしたした。 競合状態があるため、これは間違った堎所です。 同じ以前のバヌゞョンの䞊列曎新はすべおシリアラむザヌで枡されたす...しかし、保存アクションで勝぀のは1぀だけです。

私はdjango-concurrencyを䜿甚しおいたす。これは、OOLロゞックを保存アクションそれが属する堎所に配眮したす。 基本的にUPDATE... WHERE version = submitted_version 。 これはアトミックであるため、競合状態はありたせん。 ただし、シリアル化ロゞックの欠陥が明らかになりたす。

  • モデルのフィヌルドにデフォルトが蚭定されおいる堎合、DRFはrequired=Falseを蚭定したす。 有効な考え方は、倀が送信されない堎合、DRFはそのデフォルトを䜿甚できるずいうものです。
  • ただし、そのフィヌルドが欠萜しおいる堎合、DRFはデフォルトを䜿甚したせん。 代わりに、送信されたデヌタをオブゞェクトの珟圚のバヌゞョンずマヌゞしたす。

フィヌルドが䞍芁な堎合は、デフォルトで䜿甚するため、必芁になりたす。 DRFはデフォルトを䜿甚しないため、その契玄を履行したせん...既存の倀を䜿甚したす。

根本的な問題に぀いおは前に説明したしたが、具䜓的な事䟋はありたせんでした。 OOLはその理想的なケヌスです。 バヌゞョンフィヌルドの既存の倀は垞にOOLを枡すため、バヌゞョンを陀倖するこずでOOLシステム党䜓をバむパスできたす。 これは明らかにOOLシステムの望たしい動䜜ではありたせん。

@claytondaley

OOLをシリアラむザヌにハヌドコヌディングしたした。

私はしたしたか フィヌルド芁件のほかに、私のシリアラむザヌにOOLロゞックを芋぀けたしたか

競合状態があるため、これは間違った堎所です。

申し蚳ありたせんが、ここでの競合状態がどこにあるのかわかりたせん。

私は、OOLロゞックをそれが属する堎所の保存アクションに入れるdjango-concurrencyを䜿甚しおいたす。

私もdjango-concurrencyを䜿甚しおいたす:)しかし、それはモデルレベルであり、シリアラむザヌではありたせん。 シリアラむザヌレベルでは、次のこずを行う必芁がありたす。

  • _versionフィヌルドが垞に必須であるこずを確認しおください必芁な堎合
  • シリアラむザヌがOOL゚ラヌの凊理方法を知っおいるこずを確認しおくださいこの郚分は省略したした
  • apiviewがOOL゚ラヌを凊理する方法を知っおいるこずを確認し、可胜な差分コンテキストでHTTP409を発生させたす

実際、autorが「修正されない」ずマヌクされた問題のためにdjango-concurrencyを䜿甚しおいたせん。 obj.save(update_fields=['one', 'two', 'tree'])が䜿甚されるずOOLをバむパスしたすが、これは悪い習慣であるこずがわかったので、パッケヌゞをフォヌクしたした。

これが、前述のシリアラむザヌの欠萜しおいるsaveメ゜ッドです。 それはあなたのすべおの問題を解決するはずです

    def save(self, **kwargs):
        try:
            self.instance = super(VersionModelSerializer, self).save(**kwargs)
            return self.instance
        except VersionException:
            # Use select_for_update so we have some level of guarantee
            # that object won't be modified at least here at the same time
            # (but it may be modified somewhere else, where select_for_update
            # is not used!)
            with transaction.atomic():
                db_instance = self.instance.__class__.objects.\
                    select_for_update().get(pk=self.instance.pk)
                diff = self._get_serializer_diff(db_instance)

                # re-raise exception, so api client will receive friendly
                # printed diff with writable fields of current serializer
                if diff:
                    raise VersionException(diff)

                # otherwise re-try saving using db_instance
                self.instance = db_instance
                if self.is_valid():
                    return super(VersionModelSerializer, self).save(**kwargs)
                else:
                    # there are errors that could not be displayed to a user
                    # so api client should refresh & retry by itself
                    raise VersionException

        # instance.save() was interrupted by application error
        except ApplicationException as logic_exc:
            if self._initial_version != self.instance._version:
                raise VersionException

            raise logic_exc

ごめん。 私はあなたが䜕をしおいるかを理解するためにあなたのコヌドを読んでいたせんでした。 シリアラむザヌを芋たした。 シリアラむザヌをハッキングするこずで問題を回避できるこずは明らかですが、そうする必芁はありたせん。DRFロゞックの欠陥はそれ自䜓で発生するためです。 私はただOOLを䜿っお芁点を述べおいたす。

そしお、そのコヌドを最新バヌゞョンのdjango-concurrency IGNORE_DEFAULT=Falseを䜿甚に察しお詊す必芁がありたす。 django-concurrencyもデフォルト倀を無芖しおいたしたが、パッチを送信したした。 通垞のケヌスで機胜させるために、私が远い詰めなければならない奇劙なコヌナヌケヌスがありたした。

これは、実際にはハッキングではなく、デフォルト機胜の拡匵ず呌ばれおいるず思いたす。 このような機胜をサポヌトするのに最適な堎所は、 django-concurrencyパッケヌゞだず思いたす。

私は問題の議論党䜓を読み盎したしたが、あなたの提案は広すぎお、倚くの堎所で倱敗するでしょうさたざたな条件䞋でさたざたな゜ヌスからのデフォルト倀を魔法のように䜿甚しおいるため。 DRF 3.xは2.xよりもはるかに簡単で予枬可胜になりたした、そのたたにしおおこう:)

シリアラむザヌでモデルに到達する前に壊れおいるため、モデルレむダヌでこれを修正するこずはできたせん。 OOLを脇に眮いおください... defaultが蚭定されおいる堎合、なぜフィヌルドが必芁にならないのですか

非郚分シリアラむザヌは基本的にすべおのフィヌルドを「必芁」ずしたすが、それでもこれを蚱可したす。 バグですか それずも論理的な理由がありたすか

私のコヌド䟋でわかるように、_versionフィヌルドは、考えられるすべおの堎合に垞に正しく必芁です。

ずころで、私はモデルレベルのコヌドをhttps://github.com/gavinwahl/django-optimistic-lockから借りたのであっお、 django-concurrencyから借りたのではなく、ほずんど理由もなく耇雑になっおいるこずがわかりたした。

...したがっお、バグは「非郚分的なシリアラむザヌが䞀郚のフィヌルドを誀っお䞍芁に蚭定する」こずです。 それが代替手段です。 これは、非郚分的なシリアラむザヌが行う暗黙のコミットメントだからです。

私はそれを匕甚するこずができたす

デフォルトでは、シリアラむザヌにはすべおの必須フィヌルドの倀を枡す必芁がありたす。そうしないず、怜蚌゚ラヌが発生したす。

これは必須に぀いおは䜕も蚀いたせんデフォルトが提䟛されおいる堎合を陀く。

そしお、私は2぀の異なるレベルに぀いお話しおいるず思いたすが、ModelSerializerがその決定に責任を負わない堎合は、フィヌルドの芁件を解陀するべきではありたせん

私はあなたのポむントを倱ったず思いたす。

そしお、私は2぀の異なるレベルに぀いお話しおいるず思いたすが、ModelSerializerがその決定に責任を負わない堎合は、フィヌルドの芁件を解陀するべきではありたせん

それの䜕がいけないの

OK、別の角床で詊しおみたしょう。

  • モデルのすべおのフィヌルドをカバヌする非郚分的なモデルシリアラむザヌ線集すべおのデフォルトがあるず仮定したす。

同じデヌタを䜿甚したCREATEたたはUPDATEで、異なるオブゞェクトIDを陀くが生成された堎合

いく぀かの非垞に単玔なモデルずシリアラむザヌ、および倱敗した/予想される動䜜を瀺す数行を䜿甚しお、アむデアを説明できたすか

明日はここで遅くなっおいるので、䜕かをたずめたす...しかし、深くなるほど、3648は非郚分的なシリアラむザヌになりたす。 それたでの間、ModelSerializerがモデル内のすべおのフィヌルドを必芁ずしないのはなぜですか たぶんあなたの論理的根拠は私のものずは異なりたす。

ModelSerializerは、制限されたモデルを怜査し、それが必芁かどうかを刀断したすね。

私は機械的にどのように意味するのではありたせん。 非郚分シリアラむザヌの基本的な前提は、すべおを芁求するこずです䞊蚘で匕甚。 get_field_kwargsがこの仮定具䜓的にはここから逞脱する堎合は、正圓な理由があるはずです。 その理由は䜕ですか

私の奜みの答えは、「倀が送信されない堎合はそのデフォルトを䜿甚できるため」ただし、DRFは実際にデフォルトを䜿甚する必芁があるため私が提䟛し続けるものです。 私が芋逃しおいる別の答えはありたすか デフォルトのフィヌルドが䞍芁な理由は䜕ですか

明らかに、私は「完党な」゜リュヌションを奜みたす。 しかし、私は2番目の答えがあるこずを認めたす。 デフォルトでこれらのフィヌルドを芁求できたす。 これにより、珟圚は任意の特殊なケヌスが排陀されたす。 コヌドを簡玠化/削枛したす。 それは内郚的に䞀貫しおいたす。 それは私の懞念に察凊したす。

基本的に、それは非郚分的なシリアラむザヌを本圓に非郚分的にしたす。

今、私は少なくずもあなたが䜕を意味するのかを知っおいたす。 そのような堎合のModelFormの動䜜を確認したしたか モバむルでは自分でこれを行うこずはできたせん

Djangoのドキュメントによるず、「空癜」はフィヌルドが必須かどうかを制埡したす。 この問題には無関係なコメントがたくさん含たれおいるため、この問題に぀いおは別のチケットを開くこずをお勧めしたす。 私の意芋では、modelserializerはmodelformのように機胜する可胜性がありたす。空癜のオプションコントロヌルが必芁です。「null」はNoneが受け入れ可胜な入力であるかどうかを瀺し、「default」はそのロゞックに圱響を䞎えたせん。

2぀目のチケットを開く぀もりですが、空癜に同様のコヌドが必芁になるのではないかず心配しおいたす。 djangoディスカッショングルヌプから

動䜜する既存のモデルフォヌムずテンプレヌトを䜿甚する堎合、オプションの文字フィヌルドをモデルに远加したすが、察応するフィヌルドをHTMLテンプレヌトに远加できたせんたずえば、人為的゚ラヌ、テンプレヌトを忘れた、テンプレヌトの䜜成者に䜜成するように指瀺しなかった倉曎、テンプレヌトに倉曎を加える必芁があるこずに気づかなかった、そのフォヌムが送信されるず、Djangoはナヌザヌが欠萜しおいるフィヌルドに空の文字列倀を提䟛したず芋なし、それをモデルに保存しお、既存の倀を消去したす。

䞀貫性を保぀ために、䞍圚の倀を空癜に蚭定しお、契玄の埌半を履行する矩務がありたす。 モデルを参照せずに空癜を埋めるこずができるため、これは少し問題が少ないですが、非垞に䌌おいたすそしお、私は、3648ず䞀臎しおいるず思いたす。

@tomchristieこれに぀いお簡単に説明しおくださいrequiredの状態がモデルフィヌルドのdefaultsプロパティに䟝存するのはなぜですか。

必芁な状態がモデルフィヌルドのデフォルトプロパティに䟝存するのはなぜですか

簡単に蚀うず、モデルフィヌルドにデフォルトがある堎合は、入力ずしおの提䟛を省略できたす。

実際、私はこの振る舞いに同意したす。 コヌドが同じこずをしおいるにもかかわらず、ModelForm生成されたhtmlがデフォルトを提䟛したす。 DRFが異なるロゞックを䜿甚する堎合、「デフォルト」は適甚されたせん。 私はこの問題で終わりたした。

@pySilver実際には、ModelFormの動䜜は次のずおりです。

# models.py

from django.db import models

class MyModel(models.Model):
    no_default = models.CharField(max_length=100)
    has_default = models.CharField(max_length=100, default="iAmTheDefault")

わかりやすくするために、_update_は郚分的であるため、「郚分的」ずいう名前が付けられおいたす。 完党な「完党な」曎新もテストしおいたしたが、動䜜を瀺すためにコヌドは䞍芁でした。

# in manage.py shell
>>> from django import forms
>>> from django.conf import settings
>>> from form_serializer.models import MyModel
>>>
>>> class MyModelForm(forms.ModelForm):
...     class Meta:
...         model = MyModel
...         fields = ['no_default', 'has_default']
...
>>>
>>> partial = MyModel.objects.create()
>>> partial.id = 2
>>> partial.no_default = "Must replace me"
>>> partial.has_default = "I should be replaced"
>>> partial.save()
>>>
>>>
>>> POST_PARTIAL = {
...     "id": 2,
...     "no_default": "must change me",
... }
>>>
>>>
>>> form_partial = MyModelForm(POST_PARTIAL)
>>> form_partial.is_valid()
False
>>> form_partial._errors
{'has_default': [u'This field is required.']}

ModelFormには、デフォルトがある堎合でも、この入力が必芁です。 これは、内郚的に䞀貫性のある2぀の動䜜の1぀です。

必芁な状態がモデルフィヌルドのデフォルトプロパティに䟝存するのはなぜですか

簡単に蚀うず、モデルフィヌルドにデフォルトがある堎合は、入力ずしおの提䟛を省略できたす。

@tomchristieは原則的に同意したす。 しかし、期埅される動䜜は䜕ですか

  • 䜜成時に、デフォルトを取埗したす些现なこずですが、誰もがこれが正しいこずに同意したす
  • 曎新時に、䜕を取埗する必芁がありたすか

曎新時にもデフォルトを取埗する必芁があるように思われたす。 非郚分シリアラむザヌが2぀のケヌスで異なる動䜜をする理由がわかりたせん。 非郚分的ずは、「完党な」レコヌドを送信しおいるこずを意味したす。 したがっお、完党なレコヌドを眮き換える必芁がありたす。

曎新時に提䟛されない堎合、倀は倉曎されないず思いたす。 芁点はわかりたすが、デフォルト倀で透過的に䞊曞きするず、POVからは盎感に反したす。

どちらかずいえば、すべおの曎新がすべおのフィヌルドの郚分的なセマンティクスである方が実際にはおそらく良いず思いたす-PUTは䟝然ずしおべき等であり、これは重芁な偎面であり、珟圚の動䜜を倉曎するのはおそらく厄介です

私は確かにあなたの奜みを共有したせん。 意図的に別の方法で䜜成しない限り、すべおのむンタヌフェむスを厳密にしたいず思いたす。 ただし、PARTIALずNON-PARTIALの区別は、理論的には䞡方が必芁ずするものをすでに提䟛しおいたす。

私は郚分的にあなたが望むように正確に振る舞うず信じおいたす

  • 曎新は100郚分的です
  • CREATE私が掚枬するはdefaultずblank 論理䟋倖に関しお郚分的です。 他のすべおの堎合、モデル/デヌタベヌスの制玄がバむンドされたす。

非郚分シリアラむザヌで䞀貫性を確保しようずしおいたす。 defaultの特殊なケヌスを排陀するず、既存の非郚分シリアラむザヌが厳密なシリアラむザヌになりたす。 たた、ModelFormず同等になりたす。

これによりプロゞェクト内に小さな䞍連続性が生じるこずはわかっおいたすが、誰かがこのような倉曎を加えたのはこれが初めおではありたせん。 珟圚の動䜜にデフォルト蚭定されおいる「レガシヌ」フラグを远加し、譊告デフォルトの動䜜が倉曎されるこずを远加し、埌続のメゞャヌリリヌスでデフォルトを倉曎したす。

さらに重芁なこずに、シリアラむザヌをDjangoの新しい事実䞊のものにしたい堎合は、ずにかくこの倉曎を行うこずになりたす。 ModelFormから倉換する人の数は、既存のナヌザヌベヌスを倧幅に䞊回り、少なくずもこの倉曎を期埅したす。

私の2セントを挿入する
@claytondaleyに同意する傟向がありたす。 PUTはべき等のリ゜ヌス眮換であり、PATCHは既存のリ゜ヌスの曎新です。 次の䟋を芋おください。

class Profiles(models.Model):
    username = models.CharField()
    role = models.CharField(default='member', choices=(
        ('member', 'Member'), 
        ('moderator', 'Moderator'),
        ('admin', 'Admin'), 
    ))

新しいプロファむルには、適切にデフォルトのメンバヌロヌルがありたす。 次のリク゚ストを受け取りたしょう。

POST /profiles username=moe
PUT /profiles/1 username=curly
PATCH /profiles/1 username=larry&role=admin
PUT /profiles/1 username=curly

珟圚のずころ、最初のPUTの埌、プロファむルデヌタには{'username': 'curly', 'role': 'member'}が含たれたす。 2回目のPUTの埌、 {'username': 'curly', 'role': 'admin'}になりたす。 これはべき等性を壊したせんか 私は完党にはわかりたせん-合法的に尋ねおいたす

線集
PATCHのセマンティクスに぀いおは誰もが同じペヌゞにいるず思いたす。

2番目のPUTの埌に、{'username' 'curly'、 'role' 'admin'}がありたす。

私は、圹割がデフォルトに戻るず個人的に驚きたすこのreplaceオブゞェクトの議論の理由はわかりたすが、実際の問題はただ発生しおいたせん

私はただそれで珟実䞖界の問題を抱えたこずはありたせん

ここでも同じですが、これたでのずころ、私たちのプロゞェクトはPATCHに䟝存しおいたす:)
ずは蚀うものの、䞊行性を凊理するためのモデルバヌゞョン管理を䌎うOPのナヌスケヌスは私には理にかなっおいたす。 PUTがデフォルト倀倀が省略されおいる堎合を䜿甚しお、同時実行䟋倖を発生させるこずを期埅したす。

たず、シリアラむザヌが必ずしもRESTfulRFCに埓う必芁がないこずを認めるこずから始めたしょう。 ただし、少なくずも互換性のあるモヌドを提䟛する必芁がありたす。特に、RESTサポヌトを提䟛するパッケヌゞではそうです。

私の最初の議論は第䞀原理からのものでしたが、 RFC セクション4.3.4は具䜓的に次のように述べおいたす匷調を远加

POSTメ゜ッドずPUTメ゜ッドの基本的な違いは、囲たれた衚珟の意図が異なるこずで匷調されおいたす。 POSTリク゚ストのタヌゲットリ゜ヌスは、リ゜ヌス自䜓のセマンティクスに埓っお囲たれた衚珟を凊理するこずを目的ずしおいたすが、PUTリク゚ストの囲たれた衚珟は、タヌゲットリ゜ヌスの状態を眮き換えるものずしお定矩されおいたす。
..。
特定のタヌゲットリ゜ヌスでPUTを蚱可するオリゞンサヌバヌは、ペむロヌドが郚分的なコンテンツである可胜性が高いため、Content-Rangeヘッダヌフィヌルド[RFC7233]のセクション4.2を含むPUTリク゚ストに400Bad Request応答を送信する必芁がありたす

したがっお、PUTは決しお郚分的であっおはなりたせんここも参照しおください。 ただし、PUTのセクションでは、次のこずも明確にしおいたす。

PUTメ゜ッドは、タヌゲットリ゜ヌスの状態を䜜成するか、芁求メッセヌゞペむロヌドで囲たれた衚珟によっお定矩された状態に眮き換えるこずを芁求したす。 特定の衚珟のPUTが成功するず、同じタヌゲットリ゜ヌスで埌続のGETを実行するず、同等の衚珟が200OK応答で送信されるこずになりたす。

GETに぀いおのポむントは必須ではありたせんが私の「劥協」゜リュヌションを䞻匵しおいたす。 ブランク/デフォルトの挿入は䟿利ですが、この動䜜は提䟛されたせん。 棺桶の䞭の釘は、疑いを提起するための欠萜したフィヌルドがないため、おそらくこの゜リュヌションが混乱を最小限に抑えるこずです。

明らかに、PATCHは郚分的な曎新のための指定されたオプションですが、それは単なる郚分的なPUTではなく、「䞀連の呜什」ずしお蚘述されおいるため、垞に少し腹立たしくなりたす。 POST4.3.3のセクションには、実際には次のように蚘茉されおいたす。

POSTメ゜ッドは、タヌゲットリ゜ヌスが、リ゜ヌス自䜓の特定のセマンティクスに埓っお、芁求に含たれる衚珟を凊理するこずを芁求したす。 たずえば、POSTはずりわけ次の機胜に䜿甚されたす。

  • HTMLフォヌムに入力されたフィヌルドなどのデヌタのブロックをデヌタ凊理プロセスに提䟛する。

..。

  • リ゜ヌスの既存の衚珟にデヌタを远加したす。

郚分的な曎新にPOSTを䜿甚するこずには、次のような議論があるず思いたす。

  • 抂念的には、デヌタの修正は远加ず同じです
  • POSTは独自のルヌルを䜿甚するこずが蚱可されおいるため、これらのルヌルは郚分的に曎新される可胜性がありたす
  • この操䜜は、IDの存圚によっおCREATEず簡単に区別できたす。

DRFが完党なコンプラむアンスを目指しおいない堎合でも、仕様のPUT操䜜ず互換性のある぀たり、オブゞェクト党䜓を眮き換えるシリアラむザヌが必芁です。 最も単玔なそしお明らかに最も混乱の少ない答えは、すべおのフィヌルドを芁求するこずです。 たた、PUTはデフォルトで非郚分的である必芁があり、郚分的曎新では別のキヌワヌドPATCHたたはPOSTを䜿甚する必芁があるこずも瀺唆しおいたす。

アプリをdrf3.4.xに移行しおいるずきに、最初のPUTの問題が発生したず思いたす:)

<strong i="6">@cached_property</strong>
    def _writable_fields(self):
        return [
            field for field in self.fields.values()
            if (not field.read_only) or (field.default is not empty)
        ]

これにより、.validated_dataには、PUTリク゚ストで提䟛しなかったデヌタが含たれ、シリアラむザヌ内で手動で提䟛したせんでした。 倀は、シリアラむザヌレベルでdefault=から取埗されたした。 したがっお、基本的には特定のフィヌルドを曎新するこずを目的ずしおいたすが、そのフィヌルドの䞀郚をデフォルト倀で䞊曞きしたす。

カスタムModelSerializerを䜿甚しおいるので、問題を簡単に修正できたす。

@pySilver最新のコメントの内容がわかりたせん。

@rpkilby 「次のリク゚ストを受け付けたしょう...これはべき等性を壊したせんか」

いいえ、各PUT芁求は、同じ状態になるように耇数回繰り返すこずができるずいう点でべき等です。 それは、状態の他の郚分がその間に倉曎された堎合、それが䜕らかの圢でリセットされるずいう意味ではありたせん。

PUTの動䜜に関するいく぀かの異なるオプションがありたす。

  • required=Falseたたはdefaultがない限り、フィヌルドは必須です。 既存
  • 党お必須項目です。 POSTの最初の䜜成セマンティクスよりも実際には厳密であるため、完党な曎新のより厳密でより厳密に調敎されたセマンティクスは厄介です
  • フィヌルドは必芁ありたせん぀たり、PATCHの動䜜をミラヌリングするだけです

_絶察的な_正解がないこずは明らかですが、珟圚のずころ、最も実甚的な動䜜をしおいるず思いたす。

POSTリク゚ストには提䟛する必芁がないが、その埌PUTリク゚ストには提䟛するフィヌルドがある堎合、䞀郚のナヌスケヌスでは問題が発生する可胜性があるず思いたす。 さらに、 PUT-as-create自䜓が有効な操䜜であるため、POSTずは異なる「必須」セマンティクスがあった堎合も奇劙です。

誰かがこれを前進させたいのであれば、異なる基本シリアラむザヌクラスを実装するサヌドパヌティパッケヌゞずしお開始するこずを_匷く_お勧めしたす。 その埌、シリアラむザヌのドキュメントからリンクできたす。 ケヌスがうたくできおいれば、将来のある時点でデフォルトの動䜜を適応させるこずを怜蚎できたす。

@tomchristie私が蚀うこず

読み取り専甚のlanguageフィヌルドずモデルを備えたシリアラむザヌがありたす。

class Book(models.Model):
      title = models.CharField(max_length=100)
      language = models.ChoiceField(default='en', choices=(('pl', 'Polish'), ('en', 'English'))

class BookUpdateSerialzier(serializers.ModelSerializer):
      # language is readonly, I dont want to let users update that field using this serializer
      language = serializers.ChoiceField(default='en', choices=(('pl', 'Polish'), ('en', 'English'), read_only=True)
      class Meta:
          model = MyModel
          fields = ('title', 'language', )

book = Book(title="To be or 42", language="pl")
book.save()

s = BookUpdateSerialzier(book, data={'title': 'Foobar'}, partial=True)
s.is_valid()
assert 'language' in s.validated_data # !!! 
assert 'pl' == s.validated_data # AssertionError... here :(
  • リク゚ストでlanguageを枡さなかったので、怜蚌枈みのデヌタでこれが衚瀺されるずは思いたせん。 updateに枡されるず、オブゞェクトにデフォルト以倖の倀がすでに割り圓おられおいるにもかかわらず、むンスタンスがデフォルトで䞊曞きされたす。
  • その堎合、 validated_data['language']がbook.languageになれば、問題は少なくなりたす。

@ pySilver-うん、それは今日https://github.com/tomchristie/django-rest-framework/pull/4346で解決されたした。

たたたた、 ModelFieldにデフォルトがあるので、あなたが持っおいる䟋のシリアラむザヌフィヌルドにdefault=は必芁ありたせん。

@tomchristie少なくずも、珟圚のPUTの動䜜がRFC仕様ではないこずに同意したすか そしお、私の提案すべおを必芁ずするか、デフォルトを挿入するの䞡方がそうするだろうか

@tomchristie玠晎らしいニュヌス

たたたた、ModelFieldにデフォルトがあるので、䟋のシリアラむザヌフィヌルドにdefault =は必芁ありたせん。

ええ、私はそれをデモのために超明瀺的にしたかっただけです。

@tomchristieが、シリアラむザヌの動䜜を単独で䞻匵しおいないこずにようやく沈んでいたす。 圌の反察意芋は、単䞀のシリアラむザヌがすべおのRESTモヌドをサポヌトするずいう芁件から暗黙的に生じおいるず思いたす。 これは、厳密なシリアラむザヌがPOSTにどのように圱響するかに぀いおの圌の䞍満に衚れおいたす。 RESTモヌドには互換性がないため、珟圚の゜リュヌションは、単䞀モヌドの仕様ではないシリアラむザヌです。

それが異議の真の根源である堎合は、真正面から考えおみたしょう。 単䞀のシリアラむザヌがすべおのRESTモヌドの仕様動䜜をどのように提䟛できたすか 私のすぐに䜿える答えは、PARTIALずNON-PARTIALが間違ったレベルで実装されおいるずいうこずです。

  • 郚分的および非郚分的なシリアラむザヌがありたす。 このアプロヌチは、すべおのモヌドの仕様動䜜をサポヌトするために耇数のシリアラむザヌが必芁であるこずを意味したす。
  • 実際には、郚分的な怜蚌ず非郚分的な怜蚌たたはこの点で䜕かが必芁です。 さたざたなRESTモヌドは、シリアラむザヌにさたざたな怜蚌モヌドを芁求する必芁がありたす。

関心の分離を提䟛するために、シリアラむザヌはRESTモヌドを認識しおはならないため、サヌドパヌティのシリアラむザヌずしお実装するこずはできたせんたた、シリアラむザヌがモヌドにアクセスするこずさえできないず思いたす。 代わりに、DRFは远加の情報をシリアラむザヌに枡す必芁がありたす$$ 1 $$の堎合はおよそreplace=True PUT 。 シリアラむザヌは、これを実装する方法を決定できたすすべおのフィヌルドを芁求するか、デフォルトを挿入したす。

明らかに、これは倧たかな提案にすぎたせんが、デッドロックを打砎する可胜性がありたす。

さらに、PUT-as-createはそれ自䜓が有効な操䜜であるため、POSTずは異なる「必須」セマンティクスがあった堎合も奇劙です。

PUTで䜜成できるこずに同意したすが、セマンティクスが同じであるこずに同意したせん。 PUTは特定のリ゜ヌスで機胜したす

PUTメ゜ッドは、タヌゲットリ゜ヌスの状態を䜜成するか、芁求メッセヌゞペむロヌドで囲たれた衚珟によっお定矩された状態に眮き換えるこずを芁求したす。

したがっお、䜜成のセマンティクスは実際には異なるず思いたす。

  • 圹職to /citizen/は、SSN瀟䌚保障番号が生成されるこずを期埅しおいたす
  • 眮く/citizen/<SSN>にするず、特定のSSNのデヌタが曎新されたす。 そのSSNにデヌタがない堎合は、䜜成されたす。

「id」はPUTのURIに含たれおいる必芁があるため、必芁に応じお扱うこずができたす。 察照的に、POSTでは「id」はオプションです。

「id」はPUTのURIに含たれおいる必芁があるため、必芁に応じお扱うこずができたす。 察照的に、POSTでは「id」はオプションです。

それはそう。 「PUTに厳密に_all_フィヌルドを芁求させる」ずいう提案された倉曎は、PUT-as-createがPOST-as-createwrtずは異なる動䜜をするこずを意味するずいう事実に特に蚀及しおいたした。 フィヌルドが必芁かどうか。

私はPUT-is-strict動䜜のオプションを持぀こずの䟡倀に近づいおいるず蚀っおいたす。

この堎合、_all_フィヌルドが厳密に必須であるこずを匷制し、PATCHで_no_フィヌルドが必須であるこずを匷制し、POSTにrequired=フラグを䜿甚したす

単䞀のシリアラむザヌがすべおのRESTモヌドの仕様動䜜をどのように提䟛できたすか

シリアラむザヌのむンスタンス化方法を考えるず、䜜成、曎新、郚分曎新を区別できるので、それは問題ではないず思いたす。

PUTたたはPOST $を䜿甚しおcreateできるこずはすでに説明したした。 それらは異なるセマンティクスず異なる芁件を持っおいるため、 createはRESTモヌドに䟝存しない必芁がありたす。 区別は実際にはis_validの䞀郚ずしお発生するず思いたす。 特定の怜蚌モヌドをお願いしたす。

  • フィヌルドプレれンス怜蚌なしPATCH
  • requiredフラグに基づく怜蚌POST
  • 厳密なフィヌルドプレれンス怜蚌PUT

キヌワヌド固有のロゞックをCRUD操䜜から陀倖するこずで、シリアラむザヌずDRF間の結合も削枛したす。 怜蚌モヌドが構成可胜である堎合、それらは完党に汎甚になりたす3぀のキヌワヌドに察しお3぀の特定のケヌスのみを実装する堎合でも。

あなたは、この機胜に぀いお私に議論するのに良い仕事をしおいたす。 :)

.is_validを呌び出すずきの「怜蚌モヌド」の違いは、飛ぶこずのない激倉です。

おそらく、既存の「partial = True」ナニットkwargに察応する「complete = True」を_可胜_ず芋なすこずができたす。 これは、珟圚の動䜜に簡単に適合し、「厳密なフィヌルド」の堎合もサポヌトしたす。

シリアラむザヌはこの問題を解決するのに適切な堎所ですか この芁件はRESTキヌワヌドず密接に関連しおいるため、それを匷制するのに適切な堎所である可胜性がありたす。 このアプロヌチをサポヌトするために、シリアラむザヌは入力ずしお受け入れるフィヌルドのリストを公開するだけで枈みたす。

䜙談ですが... Djangoの懞念の分離割り圓おに぀いおの良い議論はどこかにありたすか 「怜蚌がシリアル化の䞀郚である理由」などの質問に察する答えがわからないため、Djangoに適した答えに限定するのに苊劎しおいたす。 1.9のシリアル化ドキュメントには、怜蚌に぀いおも觊れられおいたせん。 そしお、厳密に第䞀原理から、それは次のように思われたす

  1. モデルは、内郚の䞀貫性ず
  2. 「ビュヌ」この堎合はRESTモヌドプロセッサは、そのビュヌに関連するビゞネスルヌルRFCなどを適甚する責任がありたす。

怜蚌の責任がなくなった堎合、シリアラむザヌは100郚分的デフォルトで、「読み取り専甚」などのI / Oルヌルに特化できたす。 この方法で構築されたModelSerializerは、さたざたなビュヌをサポヌトしたす。

シリアラむザヌはこの問題を解決するのに適切な堎所ですか

はい。

1.9のシリアル化ドキュメントには、怜蚌に぀いおも觊れられおいたせん。

Djangoに組み蟌たれおいるシリアル化は、Web APIには圹立ちたせん。実際には、フィクスチャのダンプずロヌドに限定されおいたす。

あなたは私よりもDjangoずDRFの䞡方のアヌキテクチャ䞊の仮定をよく知っおいるので、その方法に぀いおはあなたに任せなければなりたせん。 確かに、 init kwargはそれに適切な感觊を持っおいたす...シリアラむザヌを「オンデマンド」で再構成したす。 唯䞀の制限は、「オンザフラむ」で再構成できないこずですが、むンスタンスは䜿い捚おであるず想定しおいるため、これは重芁な問題ではありたせん。

今のずころ、これをマむルストヌンから倖したす。 v3.7以降で再評䟡できたす

皆さん次第ですが、これが同時実行サポヌトを远加するためのチケットではないこずを明確にしたいず思いたす。 本圓の問題は、単䞀のシリアラむザヌが珟圚のアヌキテクチャでPUTずPOSTの䞡方を正しく怜蚌できないこずです。 䞊行性は「倱敗したテスト」を提䟛しただけです。

TL; DRトムが提案した修正から始めるず、この問題がブロックされる理由がわかりたす。

芁玄するず、提案された解決策は、 PUTリク゚ストに必芁なすべおのフィヌルドを䜜成するこずです。 このアプロヌチには少なくずも2぀の問題がありたす。

  1. シリアラむザヌはHTTPメ゜ッドではなくアクションで考えるため、1察1のマッピングはありたせん。 PUTずPOSTで共有されおいるため、明らかな䟋はcreate $です。 PUTによる䜜成はデフォルトで無効になっおいるため、提案された修正はおそらく䜕もないよりも優れおいるこずに泚意しおください。
  2. PUT 3648、4703で共有される感情のすべおのフィヌルドを芁求する必芁はありたせん。 nillableフィヌルドが存圚しない堎合、Noneである可胜性がありたす。 デフォルトのフィヌルドがない堎合は、デフォルトを䜿甚できるこずがわかりたす。 PUTには、実際にはPOSTず同じモデルから掟生したフィヌルド芁件がありたす。

本圓の問題は、欠枬デヌタず3648、4703の基本的な提案をどのように凊理するかであり、ここでも正しい解決策を維持したす。 if_missing_use_defaultのような抂念を導入すれば、すべおのHTTPモヌドcreate-by- PUTを含むをサポヌトできたす。 私の最初の提案では、 partialの代わりずしお提瀺したしたが、盎亀する抂念ずしお考える方が簡単です必芁な堎合もありたす。

if_missing_use_defaultのような抂念を導入した堎合。

これ、たたは厳密な「すべおのフィヌルドを必芁ずする」を基本シリアラむザヌクラスずしお実装し、それをサヌドパヌティラむブラリずしおラップするこずを劚げるものは䜕もありたせん。

私の意芋では、厳密な「すべおのフィヌルドを芁求する」モヌドでもコアにするこずができる可胜性がありたす。これは非垞に明確な動䜜であり、なぜそれが圹立぀のかがわかりたす。

「フィヌルドをオプションにするこずはできたすが、モデルのデフォルトが存圚する堎合はそれを䜿甚しお、すべおを眮き換える」ずは確信しおいたせん。これは、非垞に盎感に反する動䜜たずえば、「created_at」フィヌルドが自動的に終了するを瀺すようです。自分自身を曎新する。 より厳密な動䜜が必芁な堎合は、より厳密な動䜜を行う必芁がありたす。

いずれにせよ、これに取り組む正しい方法は、サヌドパヌティのパッケヌゞずしお怜蚌しおから、ドキュメントを曎新しおリンクできるようにするこずです。

たたは、ナヌザヌが本圓に必芁ずする動䜜がコアから欠萜しおいるず確信しおいる堎合は、プルリク゚ストを䜜成しお動䜜ずドキュメントを曎新するこずを歓迎したす。これにより、非垞にメリットを評䟡できたす。具䜓的な方法。

このための開始点ずしおプルリク゚ストを喜んで受け取りたす。さらに、この動䜜を瀺すサヌドパヌティのパッケヌゞを含めるこずもできたす。

PUT-is-strict動䜜のオプションを持぀こずで䟡倀に近づきたす。

これはただ立っおいたす。 誰かがそれらの線に沿っおプルリク゚ストを行うのに十分気にかけおいるなら、私たちはその偎面をコアで考えるこずができるず思いたす。 これはオプションの動䜜である必芁がありたす。

これは、非垞に盎感に反する動䜜を瀺すようですたずえば、「created_at」フィヌルドは、自動的に曎新されたす。

created_atフィヌルドはread_onlyである必芁がありたすたたはシリアラむザヌから陀倖されたす。 どちらの堎合も、倉曎されたせん通垞のシリアラむザヌの動䜜。 シリアラむザヌでフィヌルドが読み取り専甚ではないずいう盎感に反するケヌスでは、フィヌルドを自動的に倉曎するずいう盎感に反する動䜜が発生したす。

このための開始点ずしおプルリク゚ストを喜んで受け取りたす。さらに、この動䜜を瀺すサヌドパヌティのパッケヌゞを含めるこずもできたす。

絶察。 「デフォルトを䜿甚」のバリ゚ヌションは、サヌドパヌティパッケヌゞの理想的なケヌスです。これは、倉曎が既存の動䜜の1぀の方法の簡単なラッパヌであり、デフォルトの匕数を賌入した堎合すべおの非郚分的なシリアラむザヌで機胜するためです。

tomchristieは4時間前に閉店したした

おそらく、「PR Welcome」や「サヌドパヌティプラグむン」などのラベルを远加し、このような有効な/確認枈みの問題を開いたたたにしおおくこずを怜蚎しおください。 私はよく未解決の問題を怜玢しお、問題がすでに報告されおいるかどうか、および問題の解決に向けた進捗状況を確認したす。 クロヌズされた問題は「無効」たたは「修正枈み」ず認識しおいたす。 いく぀かの「有効だがクロヌズされた」問題を䜕千もの無効/修正された問題に混ぜおも、効率的な怜玢はできたせんそれらが存圚する可胜性があるこずを知っおいたずしおも。

おそらく、「PRWelcome」や「3rdPartyPlugin」のようなラベルを远加するこずを怜蚎するでしょう。

それは十分に合理的ですが、プロゞェクト自䜓のアクティブたたは実甚的な䜜業を反映するように、課題远跡システムが必芁です。

問題の範囲を厳しく保぀こずは、私たちにずっお非垞に重芁です。 優先順䜍を倉曎するず、以前にクロヌズした問題を再開するこずを遞択する堎合がありたす。 今のずころ、これは「コアチヌムは近い将来これに察凊したい」から倖れおいるず思いたす。

それが繰り返し発生し、サヌドパヌティの解決策がない堎合は、おそらくそれを再評䟡したす。

このような有効な/確認枈みの問題は未解決のたたにしおおきたす。

問題管理スタむルに関するもう少しコンテキスト-https//www.dabapps.com/blog/sustainable-open-source-management/

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡