Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django REST API框架中公开过滤后的反向关系?_Python_Django_Django Rest Framework - Fatal编程技术网

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)