0

シリアライザーを使用して、データベースの 2 つの列を追加し、パッケージ化し、ボーナスとして FILTER できるかどうか疑問に思っていました。

models.py

class Snippet(models.Model):
    time1= models.DateTimeField()
    time2 = models.DateTimeField()

serializers.py

class SnippetSerializer(serializers.ModelSerializer):
    sometime= UnixEpochDateField(source  = 'time1') # special serializer that converts a datetime to epoch (below)
    sometime2= UnixEpochDateField(source  = 'time2') # special serializer that converts a datetime to epoch (below)

    sometime_SUM = sometime + sometime2 # THIS DOES NOT WORK!

    class Meta:
        model = Snippet
        fields = ('sometime_SUM')

class UnixEpochDateField(serializers.DateTimeField):
    def to_native(self, value):
        """ Return epoch time for a datetime object or ``None``"""
        import time
        try:
            return calendar.timegm(value.utctimetuple())
        except (AttributeError, TypeError):
            return None

    def from_native(self, value):
        import datetime
        try:
            value = float(value)
        except:
            raise serializers.ValidationError("Not a number.  Input: %s %s"%(type(value), value))
        if value < 0:
            raise serializers.ValidationError("Cannot be less than 0. Input: %s"%value)

        return datetime.datetime.utcfromtimestamp(float(value))

ビュー.py

class SnippetList(APIView):
    """
    List all snippets, or create a new snippet.
    """
    filter = ('sometime_SUM') # THIS DOES NOT WORK!
    def get(self, request, format='json'):
        snippets = Snippet.objects.all()
        filter = SnippetFilter(request.GET, queryset = snippets)  # THIS DOES NOT WORK!
        serializer = SnippetSerializer(filter, many=True)
        return Response(serializer.data)

単純にうまくいくと思っていたのにうまくいかないコードをハイライトしました。
使用したい URL コマンドは /someurl/snippets/?sometime_SUM>4 です

編集:
どうやら、シリアル化フィールドでフィルター処理できません。質問を次のように変更させてください。time1 でフィルタリングできますか。ただし、Web サイトから API に時間を入力する場合を除きます。time1 の代わりに EPOCH 時間を使用しています。DATETIME ありがとう @mariodev

4

0 に答える 0