создание конечной точки Api двух вложенных моделей одновременно - PullRequest
0 голосов
/ 25 мая 2019

Я создаю приложение django api, у меня есть три основных приложения (Post, Anomaly, Event), пользователь может создать аномалию или событие (ведь это вложенные модели сообщений).

All iВ настоящее время программа использует generic views и mixins, поэтому я могу составить список обновлений и удалить каждую модель для себя, но теперь я хочу одним запросом создать аномалию или событие (не создавая сообщение, а создавая событие).

Пост-модели

class Post(models.Model):
    post_owner = models.ForeignKey(MyUser, on_delete=models.CASCADE)
    description = models.TextField(max_length=255)
    city = models.ForeignKey(City, related_name='location', on_delete=models.CASCADE)
    longitude = models.CharField(max_length=255)
    latitude = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

Пост-сериализаторы

class PostSerializer(serializers.ModelSerializer):
    comments = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    reactions = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Post
        fields = '__all__'

Post ApiViews

class PostAPIView(mixins.CreateModelMixin, generics.ListAPIView):
    lookup_field = 'pk'
    serializer_class = PostSerializer

    def get_queryset(self):
        qs = Post.objects.all()
        return qs

    def perform_create(self, serializer):
        serializer.save(post_owner=self.request.user)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

    def get_serializer_context(self, *args, **kwargs):
        return {"request": self.request}


class PostRudView(generics.RetrieveUpdateDestroyAPIView):
    lookup_field = 'pk'
    queryset = Post.objects.all()
    serializer_class = PostSerializer

Модель событий

class Event(models.Model):
    post = models.ForeignKey(Post, related_name='event', on_delete=models.CASCADE)
    approved_by = models.ForeignKey(MyUser, related_name='approvedBy', on_delete=models.CASCADE, null=True)
    approved_at = models.DateTimeField(null=True)
    max_participants = models.IntegerField()
    starts_at = models.DateTimeField()

Сериализаторы событий

class EventSerializer(serializers.ModelSerializer):

    class Meta:
        model = Event
        fields = '__all__'

Событие ApiViews

class EventAPIView(mixins.CreateModelMixin, generics.ListAPIView):
    lookup_field = 'pk'
    serializer_class = EventSerializer

    def get_queryset(self):
        qs = Event.objects.all()
        return qs

    def perform_create(self, serializer):
        serializer.save()

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

    def get_serializer_context(self, *args, **kwargs):
        return {"request": self.request}


class EventRudView(generics.RetrieveUpdateDestroyAPIView):
    lookup_field = 'pk'
    queryset = Event.objects.all()
    serializer_class = EventSerializer
...