Я пытаюсь создать вложенный API с DRF со следующей структурой:
проекты / посещения / действия / предметы /
- проекты может иметь несколько посещений
- каждый посещение имеет ряд действий
- каждый деятельность содержит некоторые items (изображения с метаданными)
Я использовал NestedDefaultRouter и зарегистрировал их после каждого другого:
class NestedDefaultRouter(NestedRouterMixin, DefaultRouter):
pass
router = NestedDefaultRouter()
projects_router = router.register('projects', ProjectViewSet)
projects_router.register(
'visits', VisitViewSet,
basename='projects-visit',
parents_query_lookups=['project__code']).register('activities',
AcivityViewSet,
basename='projects-visits-activities',
parents_query_lookups=['visit__project__code', 'visit__name']
).register('items',
ItemViewSet,
basename='projects-visits-activities-items',
parents_query_lookups=['item__project__code', 'item__visit__name','item__activity']
)
Цель состоит в том, чтобы заставить работать следующую структуру:
ENDPOINTS
- projects / GET: список всех проектов проектов / POST: создание нового проекта
- проектов // GET показать детали проекта
- проектов // посещения / ПОЛУЧИТЬ список всех посещений проекта
- проекты // посещения / POST создать новый визит
- проекты // посещения / GET показать подробности посещения
- проекты // посещения / деятельность / GET показать все действия определенного посещения определенного проекта
- проектов // посещения / действия / POST c создать новую активность определенного посещения определенного проекта
- проектов // посещения / действия / GET показать детали посещения
- проектов // посещения / действия // items / GET показать все элементы определенной деятельности определенное посещение определенного проекта
- проекты // посещения / действия // элементы / POST создать новый элемент для определенного действия
- проекты // посещения / действия // элементы / GET показать детали элемента
class Project(models.Model):
name = models.CharField(max_length=100, null=True)
code = models.CharField(max_length=100, null=True)
def __str__(self):
return self.name
class Visit(models.Model):
project = models.ForeignKey(Project, related_name='visits',null=True, on_delete=models.CASCADE)
name = models.CharField(max_length=100, null=True)
def __str__(self):
return self.name
class Activity(models.Model):
activity = models.CharField(max_length=100,null=True)
project = models.ForeignKey(Project, null=True, on_delete=models.CASCADE)
visit = models.ForeignKey(Visit,related_name='activities',null=True, on_delete=models.CASCADE)
def __str__(self):
return self.activity
class Item(models.Model):
image = models.ImageField(upload_to=get_name, null=True)
item = models.ForeignKey(QA_item,related_name='items',null=True, on_delete=models.CASCADE)
description = models.CharField(max_length=100, null=True)
date = models.DateTimeField('date added', auto_now_add=True)
location = models.CharField(max_length=100, null=True, blank = True)
def __str__(self):
return self.description
Мой serializers.py выглядит следующим образом:
class ProjectSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = ["name","code"]
lookup_field = "code"
class VisitSerializer(serializers.ModelSerializer):
class Meta:
model = Visit
fields = ["name"]
lookup_field = 'name'
class ActivitySerializer(serializers.ModelSerializer):
class Meta:
model = Activity
fields = ["activity"]
lookup_field = 'activity'
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = ["image","description"]
Мои запросы GET работают и дают мне объект JSON, который я хочу, но когда я хочу создать действие или элемент с POST, это не относится к его родителю. Как правильно автоматически подключать внешние ключи к родительскому объекту?