2015-02-24 77 views
0

我有兩個型號:如何在Django REST API框架中顯示過濾的反向關係?

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)。我不希望它在迴應中。我怎麼能過濾在這種情況下所有被刪除的任務?

回答

2

有幾種方法 - >從更多一般到更多特定

一般一個:改變TaskManager總是與is_deleted = False返回Task秒。

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() 

具體之一:使用prefetch_related定製Prefetch對象。

person = Person.objects.filter(is_deleted=False, pk=person_id) \ 
      .prefetch_related(
       Prefetch('task_set', queryset=Task.objects.filter(is_deleted=False)) 
      ) \ 
      .get() 

當然你也可以通過移動這個方法爲PersonManager類創建一個更中間的解決方案,這樣就可以使這樣的:

person = Person.objects.get_person_without_deleted_tasks(pk=person_id) 
+0

你救了我的一天,託多爾!我不知道這個Prefetch對象。看起來它是在Django 1.7中引入的。它像一個魅力!謝謝。 – killua8p 2015-02-25 01:32:59