Автоматически подключаться к родителю во вложенном API - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь создать вложенный 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, это не относится к его родителю. Как правильно автоматически подключать внешние ключи к родительскому объекту?

...