Как вы выполняете get_or_create в наборе моделей DRF при перезапуске функции create()?

#django #django-rest-framework

Вопрос:

У меня есть ModelViewSet с перезаписанным методом create (), так как я могу создавать несколько экземпляров одновременно. Мне было интересно, можно ли выполнить get_or_create вместо .perform_create (), как показано ниже?

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

 class CreateTokenView(viewsets.ModelViewSet):
    queryset = BayAccessToken.objects.all()
    serializer_class = accessTokenSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data, many=True)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
 

Или лучше всего просто выполнить цикл и выполнить собственное get_or_create для данных?

Ответ №1:

Вы должны переопределить метод create в сериализаторе, что-то вроде этого:

 class accessTokenSerializer(serializer.X):

    def create(self, validated_data):
        return YourModel.objects.get_or_create(name=validated_data.pop("name"), defaults=validated_data)[0]