2016-12-02 85 views
0

試圖讓多個子任務的API。 我有任務模式,可以有另外的任務,因爲父:Django-Tastypie自己的孩子

class Task(models.Model): 
    parent_task = models.ForeignKey("Task", null=True, blank=True) 
    name = models.CharField(max_length=64) 

    def __unicode__ (self): 
     return self.name 

現在,我試圖讓tastypie資源:

class TaskResource(ModelResource): 
    parent_task = fields.ForeignKey(TaskResource, 'parent_task', full=False) <-- ERROR HERE 

    class Meta: 
     queryset = Task.objects.all() 
     resource_name = 'task' 
     list_allowed_methods = ['get', 'put', 'post', 'delete'] 
     include_resource_uri = False 

    def dehydrate(self, bundle, for_list=False): 
     bundle.data["subtasks"] = "how?" <-- HOW?? 
     return bundle 

感謝您的時間。

P.S.我需要這樣的東西:

[ 
    { 
     "id": 1, 
     "name": "Task 1", 
     "subtasks": [ 
      { 
       "id": 1, 
       "name": "Task 1", 
       "subtasks": [...] 
      } 
     ] 
    }, 
    { 
     "id": 2, 
     "name": "Task 2", 
     "subtasks": "how?" 
    } 
] 

回答

1

幾乎是Including child resources in a Django Tastypie API的一個副本,但不完全是。

  1. 所以你的第一個問題是你指定關係到自我錯誤。它應該只是self

    parent_task = fields.ForeignKey('self', 'parent_task', null=True, full=False) 
    
  2. 其次,通知null=True - 父母可能是null

  3. 最後,你只需要添加其他領域的關係,並要求全部細節

    subtasks = fields.ToManyField('self', 'task_set', full=True) 
    

    task_set對於Task.parent_task領域related_name

生成的代碼是:

class TaskResource(ModelResource): 
    parent_task = fields.ForeignKey('self', 'parent_task', null=True, full=False) 
    subtasks = fields.ToManyField('self', 'subtasks', full=True) 

    class Meta: 
     queryset = Task.objects.all() 
     resource_name = 'task' 
     list_allowed_methods = ['get', 'put', 'post', 'delete'] 
     include_resource_uri = False 

而結果:

{ 
    "meta": { 
     "previous": null, 
     "total_count": 3, 
     "offset": 0, 
     "limit": 20, 
     "next": null 
    }, 
    "objects": [ 
     { 
      "parent_task": null, 
      "subtasks": [ 
       { 
        "parent_task": "/api/v1/task/1/", 
        "subtasks": [], 
        "id": 2, 
        "name": "Root's Child 1" 
       }, 
       { 
        "parent_task": "/api/v1/task/1/", 
        "subtasks": [], 
        "id": 3, 
        "name": "Root's Child 2" 
       } 
      ], 
      "id": 1, 
      "name": "Root Task" 
     }, 
     { 
      "parent_task": "/api/v1/task/1/", 
      "subtasks": [], 
      "id": 2, 
      "name": "Root's Child 1" 
     }, 
     { 
      "parent_task": "/api/v1/task/1/", 
      "subtasks": [], 
      "id": 3, 
      "name": "Root's Child 2" 
     } 
    ] 
} 
+0

OMG非常感謝你! – KaronatoR