2016-11-04 1 views
-1

PersonAppointmentという2つのモデルがあります。 があるDjango RESTフレームワーク1対多の関連フィールドデータの挿入とフィルタリング

from rest_framework import serializers 
from appointment.models import Person, Appointment 


class AppointmentSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Appointment 
     fields = ('date',) 


class PersonSerializer(serializers.ModelSerializer): 
    appointments = AppointmentSerializer(many=True) 

    class Meta: 
     model = Person 
     fields = ('name', 'email', 'appointments',) 

    def create(self, validated_data): 
     appointments_data = validated_data.pop('appointments') 
     person = Person.objects.create(**validated_data) 
     for appointment_data in appointments_data: 
      Appointment.objects.create(person=person, **appointment_data) 
     return person 

、最終的に私のビューセットは次のとおりです:

models.py

class Person(models.Model): 
    name = models.CharField(max_length=50) 
    email = models.EmailField() 

    def __str__(self): 
     return self.name 


class Appointment(models.Model): 
    person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name='appointments') 
    date = models.DateField(unique=True) 

    class Meta: 
     ordering = 'date', 

    def __str__(self): 
     return str(self.date) 

と私のserializers.pyファイルがある

class PersonViewSet(viewsets.ModelViewSet): 
    serializer_class = PersonSerializer 
    queryset = Person.objects.all() 
    filter_backends = [DjangoFilterBackend] 
    filter_fields = ['name', 'appointments'] 

私の予想として、この戻りpersons_list:

[ 
{ 
     "name": "Arif Hasan", 
     "email": "[email protected]", 
     "appointments": [ 
      { 
       "date": "2016-10-10" 
      }, 
      { 
       "date": "2016-10-17" 
      }, 
      { 
       "date": "2016-11-07" 
      } 
     ] 
    }, 
    { 
     "name": "Atanu Shome", 
     "email": "[email protected]", 
     "appointments": [ 
      { 
       "date": "2016-11-13" 
      } 
     ] 
    } 
    ] 
  • ここで新しい予定を作成することはできません。
  • 人を日付範囲でフィルタリングできません。

答えて

0

filter_backends、filter_fieldsを指定するには、タプルを使用する必要があります。 また、日付フィールドでフィルタリングしたいので、appointmentsのfilter_fields instedにappointments__dateを指定する必要があります。

次のようにあなたはあなたのビューセットを定義しておく必要があります。

class PersonViewSet(viewsets.ModelViewSet): 
    serializer_class = PersonSerializer 
    queryset = Person.objects.all() 
    filter_backends = (DjangoFilterBackend,) 
    filter_fields = ('name', 'appointments__date',) 

チェック:いくつかの問題があるがDjango filtering

+0

フィルターが働いている、あなたは私を助けてくださいすることができますしかし、どのように私はここに新しい予定を作成することができます。 –

+0

どのようなエラーが発生しています。また、日付でフィルターをかけることはできないと言いました。正確なエラーを指定してください。 – Kishan

+0

1人が多くのアポイントメント・デートを持っているので、特定の日付でフィルタリングすると、その日付のすべての人が返されます。 –

関連する問題