0

serializers.pyにフィルタコードを書くにはどうしたらいいですか? 私は以下のモデルを持っています。Djangoで複数のフィルタを書くには

User (AbstractBaseUser) 
    userid = models.CharField(max_length=64, primary_key=True) 
    username = models.CharField(max_length=128) 


Clinic (models.Model) 
    clinic_id = models.CharField(max_length=8, primary_key=True) 
    clinic_name = models.CharField(max_length=64) 


Consultation (models.Model) 
    consultation_id = models.AutoField(primary_key=True) 
    clinic_id = models.ForeignKey(Clinic) 
    user = models.ForeignKey(User) 


Chat (models.Model) 
    chat_id = models.AutoField(primary_key=True) 
    consultation_id = models.ForeignKey(Consultation) 
    DIDRESPONSE_CHOICE = { 
     ('R', 'No'), 
     ('C', 'Doing'), 
     ('F', 'Done'), 
    } 
    did_response = models.CharField(max_length=1, choices=DIDRESPONSE_CHOICE, default='N') 


ChatDetail (models.Model) 
    chat_no = models.AutoField(primary_key=True) 
    chat_id = models.ForeignKey(Chat) 
    CHATFROM_CHOICE = { 
     ('D', 'Doctor'), 
     ('U', 'User'), 
    } 
    chat_from = models.CharField(max_length=1, blank=True, null=True) 
    chat = models.CharField(max_length=512, blank=True) 

上記のデータとクライアントへの応答をJSON形式でシリアル化する必要があります。

{ 
    'username': 'Tom Smith', 
    'clinic_name': 'Adam's clinic', 
    'consultation_id': 12345678, 
    'chat_id': 09876543, 
    'chat_detail' : [ 
     {'chat_no': 11122233, 'chat_from': 'D', 'chat': 'How are you doing today?'}, 
     {'chat_no': 11112234, 'chat_from': 'U', 'chat': 'I have a headache'}, 
     {'chat_no': 11122235, 'chat_from': 'D', 'chat': 'Oh, I'm sorry'}, 
     {'chat_no': 11122236, 'chat_from': 'U', 'chat': 'Can you help me?'}, 
    ] 
} 

override_get_querysetメソッドを使用してviews.pyでフィルタを作成しました。しかし、それは仕事ではありませんでした。だから、私はserializers.pyにフィルタを書き込もうとしました。しかし、それも動作しませんでした(私は私のserializers.pyの上の要件のフィルタを書くことができません)。

私の要件を達成するにはどうすればよいですか?私を助けてください。

views.py

class WebViewChatDataOutputView(APIView): 

    def get(self, request, format=None): 
     chat_detail = ChatDetail 
     serializer = WebViewChatDataOutputSerializer(chat_detail, many=True) 
     filter_fields = ('chat_id') 
     return Response(serializer.data) 

    def get_queryset(self): 
     consultation_id = self.request.consultation_id 
     chat = Chat.objects.filter(consultation_id=consultation_id) 
     return ChatDetail.objects.filter(chat_id=chat.chat_id) 

serializers.py

class WebViewChatDataOutputSerializer(serializers.ModelSerializer): 

    # class Meta: 
    #  model = Consultation 
    #  fields = ('consultation_id') 
    # 
    # class Meta: 
    #  model = Chat 
    #  fields = ('chat_id') 
    # 
    class Meta: 
     chat = ChatDataForChatDetailSerializer(many=True) 
     model = ChatDetail 
     fields = ('chat_no', 'chat_from', 'chat') 

私は、フィルタを作成しようとしています。しかし、私は 'Meta.fields'を手に入れました。 ChatDetail、「エラーチャット

私の見解は

from .filtering import CategoryFilter 

class WebViewChatDataOutputView(generics.RetrieveAPIView): 
    def get(self, request, format=None): 

     filter_backends = (
      rest_framework.filters.OrderingFilter, 
      rest_framework.filters.DjangoFilterBackend 
     ) 

     filter_class = CategoryFilter 

     serializer = WebViewChatDataInputSerializer(chat_detail, many=True) 
     return Response(serializer_class.data) 

以下であると私filtering.pyは次の通りである

class CategoryFilter(rest_framework.filters.FilterSet): 

    name = django_filters.CharFilter(
     name=ChatDetail, 
     lookup_expr='chat_id' 
    ) 
    parent_category_name = django_filters.CharFilter(
     name=Chat, 
     lookup_expr='chat_id' 
    ) 

    class Meta: 
     model = ChatDetail 
     fields = ['ChatDetail', 'Chat'] 

ました:このフィルタセットに定義されていないフィールドが含まれています。。。私は

。アドバイスをGIMEしてください?文法のいずれかの種類を間違え私は自分のコードを更新しました。

views.py

class WebViewChatDataOutputView(generics.RetrieveAPIView): 
    def get(self, request, format=None): 

     lookup_field = 'chat_id' 
     queryset = Chat.objects.all() 
     serializer_class = ChatSerializer 

     return Response(serializer_class.data) 

serializers.py

class ChatDetailSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = ChatDetail 
     fields = '__all__' 


class ChatSerializer(serializers.ModelSerializer): 

    username = serializers.CharField(source='consultation_id.user.username') # You should rename the consultation_id foreign key field to consultation, by the way 
    clinic_name = serializers.CharField(source='consultation_id.clinic_id.clinic_name') # Same goes for clinic_id 
    chat_detail = ChatDetailSerializer(many=True, source='chatdetail_set') 

    class Meta: 
     model = Chat 
     fields = ('user_name', 'clinic_name', 'consultation_id', 'chat_id', 'chat_detail') 
+0

あなたのビューコードを表示できますか? – Thaian

+0

ありがとうございます。 views.pyとserializers.pyを追加しました。私を助けてくれますか? –

+0

あなたの問題を解決しましたか? – Thaian

答えて

2

私はあなたのエンドポイント用のフィルタを実現するためにカップルのソリューションの下に置きます。

あなたはfilter_classを使用することができますが、それはListApiViewを使用することができません。 (簡単な例のために)何かがfiltering.pyを作成し、追加します。

ビューの追加と
import django_filters 
import rest_framework.filters 

from categories import models as categories_models 


class CategoryFilter(rest_framework.filters.FilterSet): 
    name = django_filters.CharFilter(
     name='name', 
     lookup_expr='icontains' 
    ) 
    parent_category_name = django_filters.CharFilter(
     name='parent_category__name', 
     lookup_expr='icontains' 
    ) 

    class Meta: 
     model = categories_models.Category 
fields = ['name', 'parent_category_name'] 

import rest_framework.filters 

filter_backends = (
     rest_framework.filters.OrderingFilter, 
     rest_framework.filters.DjangoFilterBackend 
    ) 

filter_class = categories_filtering.CategoryFilter 

More details you find in ListApiView inspector

その明確なあなただけの別のファイルを持っているので、フィルタロジックとシリアライザから分離されています。あなたはまた、**最初get_querysetが、uは、たとえば、URLを確認することなステートメントを追加する必要があります使用することができます

:**

  1. URLをuがq値を取得する必要がある方法でフィルタフィールド
  2. でのq parametrが含まれていますこれら
  3. 書き込みクエリで何かに

が、良いアイデアを使用することです行うには(uがジェネリックに変更必要): Filter_queryset

+0

アドバイスありがとうございます。私はフィルタを使用するように自分のコードを作った。しかし、何かが間違っています。私はエラーが発生しました。私は変更されたコードを追加しました。私に助言をお願いしますか? –

+0

@KazzzStudio名前をアポストロフに入れてください。 'name = 'ChatDetail'' – Thaian

0

DRFの意味やQuerySetの意味では、問題がフィルタリングされていないように見えます。モデルに適したシリアライザとビューが必要です。

あなたが共有した出力は、指定されたChatを参照しています。シリアライザの場合はChatDetailのリストの場合はChatSerializerChatDetailSerializerが必要です。

あなたはそうChatSerializerのようなものを見ることができる、あなたの関連するモデルからデータを取得するために、あなたのシリアライザフィールドにsource引数を使用することができます。

class ChatSerializer(serializers.ModelSerializer): 

    username = serializers.CharField(source='consultation_id.user.username') # You should rename the consultation_id foreign key field to consultation, by the way 
    clinic_name = serializers.CharField(source='consultation_id.clinic_id.clinic_name') # Same goes for clinic_id 
    chat_detail = ChatDetailSerializer(many=True, source='chatdetail_set') 

    class Meta: 
     model = Chat 
     fields = ('user_name', 'clinic_name', 'consultation_id', 'chat_id', 'chat_detail') 

ChatDetailSerializerはシンプルModelSerializer

class ChatDetailSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = ChatDetail 
     fields = '__all__' 

することができあなたの意見では、DRFはデータを取得する方法を知る必要があります。 get_querysetを使用できますが、1つのモデルインスタンス(ChatDetail)が表示されているため、ApiViewに実装している場合は、代わりにRetrieveViewを使用します。または、必要に応じて他の一般的なビューを使用してください(件名のDRFドキュメントhttp://www.django-rest-framework.org/api-guide/generic-views/#retrieveapiviewを参照)。

class WebViewChatDataOutputView(generics.RetrieveAPIView): 
    lookup_field = 'chat_id' 
    queryset = Chat.objects.all() 
    serializer_class = ChatSerializer 

これだけです。私はあなたがそれを理解して欲しい。

+0

アドバイスありがとうございます。私はこのアドバイスを理解することができます。私は自分のアドバイスに従って自分のコードを修正します。しかし、私は0x7f6fc363d138のがJSONのシリアライズ可能ではありません。私はseliarizer_class.serializeを書こうとしましたが、構文エラーでした。 ChatSerializerからデータをシリアル化するにはどうすればよいですか? –

+0

@ KazzzStudioモデルインスタンスではなく、モデルクラスをシリアライザに渡しているようです。ビューコードを更新しましたか?元のビューコードでこのエラーが発生する可能性があります。 – troelsim

+0

アドバイスありがとうございます。私はviews.py "queryset = Chat.objects.all()"を更新しました。私はモデルクラスの代わりにこのコード設定インスタンスを信じています。どこが間違っているのか分かりません。 –

関連する問題