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"
}
]
}
]
- 但我不能在这里创建新约会
- 无法按日期范围筛选人员
约会日期
,而不仅仅是约会
您的视图集应定义如下:
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日的人,对吗?我认为这是正确的行为。此外,还可以使用创建约会时得到的错误回溯更新您的问题。我的问题是:为什么在创建人员时创建约会?约会创建不应该有不同的端点吗?