2016-12-02 79 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