2016-12-02 3 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 является related_name для Task.parent_task поля.

Результирующий код:

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

Смежные вопросы