Django-rest-framework: シリアラむザヌDateTimeFieldに予期しないタむムゟヌン情報がありたす

䜜成日 2015幎12月13日  Â·  34コメント  Â·  ゜ヌス: encode/django-rest-framework

蚭定にTIME_ZONE = 'Asia/Kolkata'ずUSE_TZ = Trueがありたす。

閲芧可胜なAPIを䜿甚しお新しいオブゞェクトを䜜成するず、シリアラむザヌは、新しく䜜成されたオブゞェクトを、タむムゟヌンを瀺す+5:30末尟が付いた日時で衚瀺したす。 デヌタベヌスはUTCで時間を保存しおいたす。

予期しない動䜜ずしお、オブゞェクトが埌で再床シリアル化されるず、日時はすべおUTC圢匏になり、末尟にZたす。 珟圚のタむムゟヌンずデフォルトのタむムゟヌンに関するDjangoのドキュメントによるず、シリアラむザヌが日時を珟圚のタむムゟヌンに倉換するこずを期埅しおいたす。珟圚のタむムゟヌンは、デフォルトでTIME_ZONE = 'Asia/Kolkata'によっお蚭定されるデフォルトのタむムゟヌンになりたす。

私は䜕かが足りないのですか

Needs further review

最も参考になるコメント

この機胜もいただければ幞いです。 暙準のDjangoの動䜜ず同様に、 USE_TZ蚭定を尊重し、倀を倉換する必芁があるず思いたす。

党おのコメント34件

スタックオヌバヌフロヌに぀いお尋ねたずころ、珟圚のタむムゟヌンはナヌザヌが指定した日時にのみ䜿甚されるずいう結論に達したした。日時は怜蚌埌぀たり、䜜成たたは曎新埌そのたたシリアル化されるためです。 Djangoのドキュメントから、これが意図された動䜜であるずは信じがたいですが、これはRest FrameworkではなくDjango自䜓の問題であるため、この問題を閉じたす。

こんにちは@tomchristie 、

これはDRFのバグだず思いたす。
IMHO、DRFの自然な䜿甚法は、djangoテンプレヌトのような出力ずしお䜿甚するこずです。
djangoテンプレヌトでタむムゟヌンが正しく衚瀺されおいるのに、drfシリアラむザヌがdjangoのタむムゟヌン蚭定を尊重しないのはなぜですか

やあ、

DatetimeFieldクラスのfields.pyのコヌドを調べるず、Djangoのタむムゟヌン蚭定が内郚倀 to_internal_value() に察しおのみ考慮されおいるこずがわかりたした。

私は次のようなモデルシリアラむザヌを䜿甚しおいるのを芋おきたした

class MyModelSerializer(ModelSerializer):

    class Meta:
        model = MyModel
        depth = 1
        fields = ('some_field', 'my_date_time_field')

フィヌルドmy_date_time_field DateTimeFieldだず思いたす:)の堎合、衚珟のタむムゟヌンはデフォルトではNoneです to_representation() 。

蚀い換えれば、私が間違っおいなければ、Djangoタむムゟヌンは倀がストレヌゞバック゚ンドに曞き蟌たれたずきにのみ考慮されたす。

IMHO to_representation()の戻り倀は次のようになるず思いたす。
return self.enforce_timezone(value).strftime(output_format)
Django USE_TZ蚭定によるず。

これに察するプルリク゚ストを䜜成したす。

チャオ
ノァレンティノ

@vpistis珟圚

TIME_ZONE = 'Asia/Kolkata'を蚭定し、単䞀の日時フィヌルドappointmentを持぀モデルシリアラむザヌを䜜成したす。

䜜成/曎新䞭に、以䞋を送信したす。

{
    "appointment": "2016-12-19T10:00:00"
}

そしお戻っおください

{
    "appointment": "2016-12-19T10:00:00+5:30"
}

ただし、そのオブゞェクトを再床取埗たたは䞀芧衚瀺するず、次のようになりたす。

{
    "appointment": "2016-12-19T04:30:00Z"
}

䜜成時にZが指定されおいない堎合、DRFは、クラむアントがTIME_ZONE指定されたタむムゟヌンを䜿甚しおいるず芋なし、そのタむムゟヌンにフォヌマットされた時間を返したす最埌に+5:30を远加したす。クラむアントが提䟛した時間であれば、実際には無効になりたす。 将来のアクセスでもそのタむムゟヌンにフォヌマットされた時刻が返される堎合は、おそらくより理にかなっおいるため、取埗/リスト䞭の応答は䜜成/曎新䞭ず同じでした。

䜜成/曎新䞭に末尟のZが提䟛されたずきに、構成されたタむムゟヌンで時間を返すかどうかずいう問題もありたす。たずえば、次のように送信したす。

{
    "appointment": "2016-12-19T04:30:00Z"
}

戻り倀

{
    "appointment": "2016-12-19T10:00:00+5:30"
}

リスト/取埗の応答ず䞀貫性のある応答を維持するので、私はこれに賛成です。

もう1぀のオプションは、䜜成/曎新䞭であっおも、垞にUTC時間を返すこずですが、あたり圹に立たないこずがわかりたした。 いずれにせよ、珟圚の50/50のような状況よりも、䞀貫したタむムゟヌンを持぀こずが望たしいでしょう。

TIME_ZONE = 'Asia / Kolkata'を蚭定し、単䞀の日時フィヌルドである予定を持぀モデルシリアラむザヌを䜜成したす。

䜜成/曎新䞭に、以䞋を送信したす。

{{
「予定」「2016-12-19T100000」
}
そしお戻っおください

{{
"予定" "2016-12-19T100000 + 530"
}
ただし、そのオブゞェクトを再床取埗たたは䞀芧衚瀺するず、次のようになりたす。

{{
「予定」「2016-12-19T043000Z」
}

ありがずう@ jonathan-golorryこれは私が実際に芋おいる正確な動䜜です。
私の堎合、動䜜は次のようになりたす@ jonathan-golorryの䟋を䜿甚:)

デフォルトのDATETIME_FORMATを䜿甚した䜜成/曎新䞭に、以䞋を送信したす。

{
    "appointment": "2016-12-19T10:00:00"
}

そしお戻っおください

{
    "appointment": "2016-12-19T10:00:00+5:30"
}

そのオブゞェクトを再床取埗たたは䞀芧衚瀺するず、次のようになりたす。

{
    "appointment": "2016-12-19T10:00:00+5:30"
}

IMHOは、この動䜜を管理するためのDRF蚭定である必芁がありたす。たずえば、DateTimeFieldをデフォルトのタむムゟヌンで衚瀺するように匷制する蚭定です。

どうもありがずう@tomchristie

異なるアクション間の䞍䞀臎は、ここで再開するためのクリンチャヌです。 そうだずは思いもしたせんでした。 オプションにするこずもできたすが、デフォルトではUTCを䜿甚するこずを期埅しおいたす。

DRF 3.4.6を䜿甚する本番Webアプリの堎合、次の回避策で解決したした。
https://github.com/vpistis/django-rest-framework/commit/be62db9080b19998d4de3a1f651a291d691718f6

誰かが次のいずれかを含むプルリク゚ストを送信したい堎合

  • 倱敗したテストケヌスを含むだけ、たたは...
  • テストケヌス+修正

それは倧歓迎です。

テストするコヌドをいく぀か䜜成したしたが、drfテストケヌスの䜿甚方法がわかりたせん。 実行時にタむムゟヌンやその他の蚭定を倉曎するためにdjango蚭定を管理する方法がわかりたせん。
具䜓的な䟋やガむドをリンクしおください。

ありがずう

グロヌバルテスト蚭定を倉曎する堎合は、ここにあり

テスト䞭に蚭定を䞊曞きしようずしおいる堎合は、 override_settingsデコレヌタを䜿甚できたす。

この機胜もいただければ幞いです。 暙準のDjangoの動䜜ず同様に、 USE_TZ蚭定を尊重し、倀を倉換する必芁があるず思いたす。

ここでの最初のステップは、珟圚のテストスむヌトに远加できる倱敗したテストケヌスを䜜成するこずです。
次のステップは、その堎合の修正を開始するこずです:)

やあ、
私にずっお、これはこの機胜のテストケヌスです

class TestDateTimeFieldTimeZone(TestCase):
    """
    Valid and invalid values for `DateTimeField`.
    """
    from django.utils import timezone

    valid_inputs = {
        '2001-01-01 13:00': datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.get_default_timezone()),
        '2001-01-01T13:00': datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.get_default_timezone()),
        '2001-01-01T13:00Z': datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.get_default_timezone()),
        datetime.datetime(2001, 1, 1, 13, 00): datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.get_default_timezone()),
        datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.UTC()): datetime.datetime(2001, 1, 1, 13, 00,
                                                                                        tzinfo=timezone.get_default_timezone()),
        # Django 1.4 does not support timezone string parsing.
        '2001-01-01T13:00Z': datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.get_default_timezone())
    }
    invalid_inputs = {}
    outputs = {
        # This is not simple, for now I suppose TIME_ZONE = "Europe/Rome"
        datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.get_default_timezone()): '2001-01-01T13:00:00+01:00',
        datetime.datetime(2001, 1, 1, 13, 00, ): '2001-01-01T13:00:00+01:00',
    }

    field = serializers.DateTimeField()

私のフォヌクでは、いく぀かのトリックを䜿甚しお、3.6.2_tz_fixの正しいタむムゟヌンで時間を取埗したす。

私はこの助けを願っおいたす:)

これは閉じおいるようですが、drf 3.6.3を実行しおいお、postgresデヌタベヌスにこのタむムスタンプ「2017-07-12142600-06」がありたすが、postmanを䜿甚しおデヌタを取埗するず、この「タむムスタンプ」が取埗されたす。 「2017-07-12T202600Z」。 -06時間远加されおいるようです。

私のdjango蚭定では、tzlocalを䜿甚しおタむムゟヌンTIME_ZONE = str(get_localzone())たす。 したがっお、タむムゟヌンは起動時に蚭定されたす。

基本的なmodelSerializerを䜿甚しおいたす

class SnapshotSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snapshot
        resource_name = 'snapshot' 
        read_only_fields = ('id',)
        fields = ('id', 'timestamp', 'snapshot')

私は䜕かが足りないのですか

閉じおいたせん、ただ開いおいたす:)
衚瀺されおいる赀い「閉じたボタン」は、参照甚です。
...そしおあなたは正しいです、「バグ」はただそこにありたす;
マむルストヌンが3.6.3から3.6.4に倉曎されたした。

ああ、わかりたした。 ありがずうございたした

2017幎7月12日午埌5時10分、「ValentinoPistis」 [email protected]
曞きたした

閉じおいたせん、ただ開いおいたす:)
衚瀺されおいる赀い「閉じたボタン」は、参照甚です。
...そしおあなたは正しいです、「バグ」はただそこにありたす;
マむルストヌンが3.6.3から3.6.4に倉曎されたした。

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/encode/django-rest-framework/issues/3732#issuecomment-314923582 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AIMBTcx-6PPbi_SOqeLCjeWV1Rb59-Ohks5sNVJ0gaJpZM4G0aRE
。

やあ、

これが元の質問に完党に関連しおいるかどうかはわかりたせんが、 https //docs.djangoproject.com/en/1.11/ref/utils/#djangoのように、DRFが蚭定されおいるタむムゟヌンのオヌバヌラむドを尊重する必芁があり

ナヌザヌがタむムゟヌンに関連付けられおいるシステムがあり、APIはナむヌブな日時を受け取りたす。 これらの日時を珟圚のナヌザヌのタむムゟヌンに倉換できるず思いたすが、 ../rest_framework/fields.pyがデフォルトのタむムゟヌン぀たり、django蚭定ファむルのタむムゟヌンを適甚しおいるこずに気付きたした。

    def enforce_timezone(self, value):
        field_timezone = getattr(self, 'timezone', self.default_timezone())

        if (field_timezone is not None) and not timezone.is_aware(value):
            try:
                return timezone.make_aware(value, field_timezone)

[...]

    def default_timezone(self):
        return timezone.get_default_timezone() if settings.USE_TZ else None

私の堎合のように、アプリケヌションがオヌバヌラむドを蚭定した堎合に備えお、これは実際にtimezone.get_current_timezone()を蚭定ずしお䜿甚する必芁がありたすか

こんにちは@RichardForshawは別の問題のようですが、確かに同じ球堎です。

期埅される動䜜をカバヌする適切なテストケヌスのセットを取埗できれば、ここでPRを確認するこずは間違いないず思いたす。

私の最初の考えはそれを超えお、サヌバヌの構成されたタむムゟヌンに䟝存するのではなく、タむムゟヌン情報をAPIに送信するこずを確認するこずです。 それを超えお、私はあなたがクラむアントの時間をロヌカラむズする準備をする必芁があるず思う傟向がありたす。

しかし、はい、ここで察凊すべき矛盟がありたす。 PRぞようこそず蚀いたしたか🙂

carltongibson / django-filter750はここに関連しおいるはずです。 私はもずもずdjango-filterのタむムゟヌン凊理をDRFに基づいおいたので、750での倉曎をここで簡単に適甚できたす。

私の初心者には申し蚳ありたせんが、ここでの問題は正確には䜕ですか 私のpsqlデヌタベヌスのタむムスタンプは正しく、Djangoは正しいタむムゟヌンを䜿甚するように蚭定されおいたす。 タむムスタンプを倉換しないようにするDRF蚭定はありたすか

こんにちは@ michaelaelise—デヌタの䟋䞊郚近くを芋るず

  1. 圌らはタむムゟヌン情報なしで日時を送信しおいたす。 これは私の本では悪い動きです。
  2. サヌバヌはロヌカルタむムゟヌンを適甚しおいお、そのように戻っおきたすこの堎合は+5:30 
  3. しかし、埌でそれをフェッチするず、UTCずしお返されたす Z 、「Zulu」の堎合。

クラむアントがタむムゟヌン倉換を凊理するこずを前提ずしお、実際の問題ん。 おそらくNo1を陀いお、クラむアントのタむムゟヌン蚭定がサヌバヌず同じであるず誰が蚀うのでしょうか...

しかし、それは少し矛盟しおいたす、確かに2ず3は同じ圢匏である必芁がありたすか クラむアントは正しく、どちらかを同等の倀ずしお受け入れたすが。

私はこれを閉じる傟向がありたす。

  • ここには論理゚ラヌはありたせん。

    • これらは同じ時間です "2016-12-19T10:00:00+5:30"ず"2016-12-19T04:30:00Z" —ある皋床、圌らがどのように戻っおくるかを気にするのは誰ですか

  • したがっお、それは私が本圓に時間を割り圓おるこずを正圓化できるものではありたせん。
  • チケットは2幎前のもので、誰もPRを提䟛しおいたせん。

PRを芋おうれしいですが、これを_未解決の問題_ず本圓に考えたいかどうかはわかりたせん。

ああ、この号のスレッドの元の投皿で、「Z」がそれを意味しおいるこずに気づいおいたせんでした。
では、DRFは認識された日時をUTCに倉換しお、UI /呌び出し元によっお凊理されたすか
その説明をありがずう。

最埌に䞀぀だけ。
異なるタむムゟヌンでデバむスをポヌリングしおいるため、「2016-12-19T100000 + 530」を返したい堎合はどうなりたすか。
これは「RETURN_DATETIME_WITH_TIMEZONE」の蚭定でしょうか

゚ッゞデバむスでdjango / drfを䜿甚しおいたす。 したがっお、挿入されるすべおの日時は、゚ッゞデバむスのタむムゟヌンが構成されおおり、postgresフィヌルドがそのデバむスの日時に察しお垞に正確であるため、ナむヌブであるかどうかは関係ありたせん。

珟圚のシナリオのクラりドサヌバヌは、各デバむスのタむムゟヌンを知る必芁がありたす。おそらく、䜜業をdjango / drfからクラりドアプリにシフトしお凊理するだけです。

USE_TZを想定するず、DRFはすでにタむムゟヌン情報ずずもに日時を返しおいたす。 だから、それはあなたがそこで必芁なこずをすでにやっおいたす。

ここでの唯䞀の問題は、同じDTが1぀のタむムゟヌンたたは別のタむムゟヌンのようにフォヌマットされおいるかどうかです。 しかし、それらはただ同じ時間です。

@carltongibson

ここには論理゚ラヌはありたせん。
これらは同じ時間です「2016-12-19T100000 + 530」ず「2016-12-19T043000Z」—ある皋床、圌らがどのように戻っおくるかを気にするのは誰ですか

私芋これが問題です返された文字列
私はDjangoタむムゟヌン蚭定を䜿甚しおおり、すべおのテンプレヌトは予想どおり正しい時刻"2016-12-19T10:00:00+5:30"返したすが、DRFは返したせん。 DRFは"2016-12-19T04:30:00Z"返したす。
クラむアントに、それは私のREST APIを消費したす、それはロゞックも、時間倉換も日時文字列解釈もありたせん。
蚀い換えるず、DRF応答からの日時はDjangoテンプレヌトの「応答」ず同じであるず期埅しおいたす。サヌバヌはクラむアントのすべおのデヌタを準備し、クラむアントはそれのみを衚瀺したす。

ずにかく、この玠晎らしいプロゞェクトぞのあなたの忍耐、サポヌト、そしおあなたの玠晎らしい仕事に感謝したす

@vpistisここでの私のポむントは、衚珟された日付が正しいずいうこずです。衚珟だけが期埅されおいたせん。 それをネむティブの日付に解析するずすぐに、どの蚀語でもそれを凊理したすが、違いはありたせん。

ナヌザヌが日付文字列を日付に解析するこずを期埅したすが、クラむアント蚀語は生の文字列を消費するのではなく、それを提䟛したす。

あなたが生の匊を消費しおいるなら、あなたの期埅はここでは満たされたせん。 ただし、そうしないでください。UNIXタむムスタンプを送信した堎合を想像しおください。これらを未加工で䜿甚する方法はありたせん。クラむアント蚀語に関係なく、適切なDateオブゞェクトに倉換しおください。

これに぀いおPRをずるこずができお本圓にうれしいです。 ただ閉じおいたせん

しかし、報告されおからほが2幎、最初のコメントから9か月が経ちたしたあなたの、1幎埌。 誰も私たちに倱敗したテストケヌスを䞎えおくれたせんでした。 それは誰にずっおもそれほど重芁なこずではありたせん。 そのため、時間を割り圓おるのは困難です。

そのため、PRが発生した堎合はPRを行うこずに基づいお閉鎖する傟向がありたす

みなさん、こんにちは。これは5408で修正する必芁がありたす。 ブランチをむンストヌルしお、すべおが期埅どおりに機胜しおいるこずを確認する時間があれば、それは玠晎らしいこずです。 ありがずう

この問題はどういうわけか、再導入されたず思いたす。

デフォルトのTZをUTCからペヌロッパ/アムステルダムに倉曎したずき、テストの1぀が倱敗し、DRFがデフォルトのTZずは異なるものにシリアル化されおいるこずに気付きたした。

線集問題はテスト/工堎のセットアップに関連しおいたした。


以䞋のセットアップをテストしたす。

モデル

class Something(StampedModelMixin):
    MIN_VALUE = 1
    MAX_VALUE = 500

    id = models.BigAutoField(primary_key=True)  # pylint: disable=blacklisted-name
    product_id = models.BigIntegerField(db_index=True)
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    percentage = models.IntegerField()
    enabled = models.IntegerField()

工堎

class SomethingFactory(factory.django.DjangoModelFactory):
    """ Base Factory to create records for Something

    """
    start_time = factory.Faker('date_time', tzinfo=get_default_timezone())
    end_time = factory.Faker('date_time', tzinfo=get_default_timezone())
    percentage = factory.Faker('random_int', min=1, max=500)
    enabled = factory.Faker('random_element', elements=[0, 1])

    class Meta:  # pylint: disable=missing-docstring
        model = Something

単䜓テスト

class TestSomething:
    def test__get__empty(self):
        # preparation of data
        series = SeriesFactory.create(product_id=2)
        SomethingFactory.create_batch(3, product_id=1)

        # prepare request params
        url = reverse('series-somethings', kwargs={'pk': series.pk})

        # call the endpoint
        response = self.client.get(url)

        # asserts
        assert response.data == []

    def test__get__single(self):
        # preparation of data
        series = SeriesFactory.create(product_id=1)
        old_somethings = SomethingFactory.create_batch(1, product_id=1)

        # prepare request params
        url = reverse('series-somethings', kwargs={'pk': series.pk})

        # call the endpoint
        response = self.client.get(url)

        # asserts
        assert SomethingSerializer(old_somethings, many=True).data == response.data

芋る

class SomethingElseView(APILogMixin, ModelViewSet):
    @action(detail=True, methods=['get'])
    def somethings(self, request, pk=None):
        """ GET endpoint for Somethings

        .. seealso:: :func:`rest_framework.decorators.action`
        """
        otherthings = self.get_object()
        something_qs = Something.objects.all()
        something_qs = something_qs.filter(product_id=otherthings.product_id)
        serializer = self.something_serializer_class(something_qs, many=True)
        return Response(serializer.data)

シリアラむザヌ

class SomethingSerializer(serializers.ModelSerializer):

    class Meta:
        model = Something
        list_serializer_class = SomethingListSerializer
        fields = '__all__'
        extra_kwargs = {
            'percentage': {'min_value': Something.MIN_VALUE,
                           'max_value': Something.MAX_VALUE}
        }
        read_only_fields = ('id',
                            'ts_activated',
                            'ts_created',
                            'ts_updated')

ipdbの結果をテストする

ipdb> old_somethings
[{'product_id': 1, 'start_time': datetime.datetime(2011, 7, 13, 1, 10, 33, tzinfo=<DstTzInfo 'Europe/Amsterdam' LMT+0:20:00 STD>), 'end_time': datetime.datetime(2003, 3, 10, 9, 31, tzinfo=<DstTzInfo 'Europe/Amsterdam' LMT+0:20:00 STD>), 'percentage': 103, 'enabled': 0}]
ipdb> response.data
[OrderedDict([('id', 1), ('ts_created', '2019-02-27 14:16:33'), ('ts_updated', '2019-02-27 14:16:33'), ('product_id', 1), ('start_time', '2011-07-13 02:50:33'), ('end_time', '2003-03-10 10:11:00'), ('percentage', 103), ('enabled', 0)])]

テスト結果

E       AssertionError: assert [OrderedDict(...nabled', 0)])] == [OrderedDict([...nabled', 0)])]
E         At index 0 diff: OrderedDict([('id', 1), ('ts_created', '2019-02-27 14:38:15'), ('ts_updated', '2019-02-27 14:38:15'), ('product_id', 1), ('start_time', '2011-07-13 01:10:33'), ('end_time', '2003-03-10 09:31:00'), ('percentage', 103), ('enabled', 0)]) != OrderedDict([('id', 1), ('ts_created', '2019-02-27 14:38:15'), ('ts_updated', '2019-02-27 14:38:15'), ('product_id', 1), ('start_time', '2011-07-13 02:50:33'), ('end_time', '2003-03-10 10:11:00'), ('percentage', 103), ('enabled', 0)])
E         Full diff:
E         - [OrderedDict([('id', 1), ('ts_created', '2019-02-27 14:38:15'), ('ts_updated', '2019-02-27 14:38:15'), ('product_id', 1), ('start_time', '2011-07-13 01:10:33'), ('end_time', '2003-03-10 09:31:00'), ('percentage', 103), ('enabled', 0)])]
E         ?                                                                                                                                                       ^^^^^^^^^^                          ^^^^^^^^^^^
E         + [OrderedDict([('id', 1), ('ts_created', '2019-02-27 14:38:15'), ('ts_updated', '2019-02-27 14:38:15'), ('product_id', 1), ('start_time', '2011-07-13 02:50:33'), ('end_time', '2003-03-10 10:11:00'), ('percentage', 103), ('enabled', 0)])]
E         ?

スタック

Django==2.0.10
djangorestframework==3.9.0
factory-boy==2.11.1
Faker==0.8.18
pytz==2018.9

こんにちは@ diegueus9-これをより単玔なテストケヌスに枛らすこずができたすか シリアル化された停のデヌタずビュヌの応答デヌタを比范しおいたす。 したがっお、実際の期埅倀が䜕であるかは明確ではありたせん。 いく぀かの結果をハヌドコヌドされた倀ず比范するこずをお勧めしたす。 䟋えば、

assert SomethingSerializer(old_somethings, many=True).data == {'blah':'blah'}

@rpkilbyご回答ありがずう

    for old_something in old_somethings:
        old_something.refresh_from_db()

以前のコメントを削陀する必芁がありたすか、それずも他の誰かが同じ誀怜知を経隓した堎合に備えおコメントを残す必芁がありたすか

こんにちは@ diegueus9 、心配ありたせん- detailsタグにコヌドを隠しただけです。

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