добавление пользователя в поле многие ко многим при создании модели - PullRequest
0 голосов
/ 07 февраля 2020

Добрый день, я пытаюсь создать набор представлений, при котором при создании витрины пользователь добавляется в качестве одного из администраторов во многие ко многим полям, но мой код, похоже, не работает. Ниже я попробовал, но это не работает.

models.py

class Showcase(models.Model):
    title = models.CharField(max_length=50)
    description = models.TextField(null=True)
    skill_type = models.ForeignKey(Skill, on_delete=models.CASCADE)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name="Showcases")
    content = models.TextField(null=True)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    voters = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="upvotes")
    slug = models.SlugField(max_length=255, unique=True)
    administrator = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="administrators", blank=True)

    def __str__(self):
        return self.title

views.py

class showcaseCreateViewSet(generics.CreateAPIView):
    queryset = Showcase.objects.all()
    serializer_class = ShowcaseSerializer
    permission_classes = [IsAuthenticatedOrReadOnly]

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

serializers.py

class ShowcaseSerializer(serializers.ModelSerializer):
    user = serializers.SlugRelatedField(read_only=True, slug_field='slug')
    created_on = serializers.SerializerMethodField(read_only=True)
    likes_count = serializers.SerializerMethodField(read_only=True)
    user_has_voted = serializers.SerializerMethodField(read_only=True)
    slug = serializers.SlugField(read_only=True)
    comment_count = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = Showcase
        exclude = ['voters', 'updated_on', 'id', 'administrator']

    def get_likes_count(self, instance):
        return instance.voters.count()

    def get_user_has_voted(self, instance):
        request = self.context.get("request")
        return instance.voters.filter(pk=request.user.pk).exists()

    def get_comment_count(self, instance):
        return instance.comments.count()

1 Ответ

2 голосов
/ 07 февраля 2020

Я думаю, что это может быть альтернативой, вместо перезаписи perform_create, перезаписи create

class showcaseCreateViewSet(generics.CreateAPIView):
    queryset = Showcase.objects.all()
    serializer_class = ShowcaseSerializer
    permission_classes = [IsAuthenticatedOrReadOnly]

    def create(self, request):
        serializer = self.serializer_class(
            data=request.data
        )
        if serializer.is_valid():
            showcase = serializer.save(user=request.user)
            if showcase:
                showcase.administrator.add(request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Другая возможность заключается в передаче запроса (или просто пользователя) в контексте Сериализатор, реализуя get_serializer_context,

def get_serializer_context(self):
    return {
        'request': self.request
    }

, а затем реализует метод create сериализатора,

def create(self, validated_data):
    showcase = Showcase(**validated_data)
    showcase.administrator.add(self.context['request'].user)
    showcase.save()
    return showcase
...