Python 如何在Django REST API框架中公开过滤后的反向关系?
我有两种型号:Python 如何在Django REST API框架中公开过滤后的反向关系?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有两种型号: class Task(models.Model): person = models.ForeignKey(Person, related_name='tasks') title = models.CharField(max_length=200) is_deleted = models.BooleanField(default=False) class Person(models.Model): name = models.CharField(m
class Task(models.Model):
person = models.ForeignKey(Person, related_name='tasks')
title = models.CharField(max_length=200)
is_deleted = models.BooleanField(default=False)
class Person(models.Model):
name = models.CharField(max_length=100)
is_deleted = models.BooleanField(default=False)
和两个序列化程序:
class PersonSerializer(serializers.ModelSerializer):
tasks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = Person
fields = ('id', 'name', 'tasks')
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = ('id', 'title')
我想构建一个API,返回人员详细信息以及属于此人的未删除任务列表。
例如:
{
"id": 1,
"name": "Alan",
"tasks": [
100,
101,
102
]
}
因此,在view.py
中,我得到了:
@api_view(['GET'])
def api_person_detail(request, person_id):
"""
Project details
"""
if request.method == 'GET':
try:
person = Person.objects.get(is_deleted=False, pk=person_id)
except Person.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
serializer = PersonSerializer(person)
return Response(serializer.data)
所有工作正常,但任务101被删除(is_delete=True)。我不想在答复中提到这一点。在这种情况下,我如何筛选所有已删除的任务?有几种方法->从“更多常规”到“更多特定” 常规方法:更改
任务管理器
以始终返回任务
s,其中被删除=False
class TaskManager(models.Manager):
def get_queryset(self):
return super(self.__class__, self).get_queryset().filter(is_deleted=False)
class Task(models.Model):
# ...
objects = TaskManager()
特定的选项:与自定义对象一起使用
当然,您可以通过将此方法移动到PersonManager
类中来创建一个更的中间解决方案,这样您就可以创建如下内容:
person = Person.objects.get_person_without_deleted_tasks(pk=person_id)
托多,你救了我一天!我不知道这个预取对象。看起来它是在Django 1.7中引入的。它就像一个符咒!非常感谢。
person = Person.objects.get_person_without_deleted_tasks(pk=person_id)