Python Django REST框架一对多相关字段数据插入和筛选

Python Django REST框架一对多相关字段数据插入和筛选,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有两种型号,个人和约会。一个人有许多约会 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(

我有两种型号,
个人
约会
。一个
有许多
约会

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文件是:

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
最后,我的视图集是:

class PersonViewSet(viewsets.ModelViewSet):
    serializer_class = PersonSerializer
    queryset = Person.objects.all()
    filter_backends = [DjangoFilterBackend]
    filter_fields = ['name', 'appointments']
这是我期望的返回人员列表:

    [
 {
        "name": "Arif Hasan",
        "email": "arif@gmail.com",
        "appointments": [
            {
                "date": "2016-10-10"
            },
            {
                "date": "2016-10-17"
            },
            {
                "date": "2016-11-07"
            }
        ]
    },
    {
        "name": "Atanu Shome",
        "email": "atanu@gmail.com",
        "appointments": [
            {
                "date": "2016-11-13"
            }
        ]
    }
    ]
  • 但我不能在这里创建新约会
  • 无法按日期范围筛选人员

您应该使用元组来指定filter\u后端、filter\u字段。 此外,您还希望按日期字段进行筛选,因此您必须在筛选字段中指定
约会日期
,而不仅仅是
约会

您的视图集应定义如下:

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

检查:

过滤器正在工作,尽管存在一些问题,您能否帮助我,但如何在此处创建新约会。您遇到了什么错误。你还说不能按日期过滤,现在你说它工作了。请指定确切的错误。因为一个人有多个约会日期,所以当我按某个日期筛选时,它将返回该人及其所有日期。好的,如果您将日期传递为2016年11月2日,它将返回所有约会日期为2016年11月2日的人,对吗?我认为这是正确的行为。此外,还可以使用创建约会时得到的错误回溯更新您的问题。我的问题是:为什么在创建人员时创建约会?约会创建不应该有不同的端点吗?